<?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=Robert+d</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=Robert+d"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/Robert_d"/>
		<updated>2026-05-16T01:23:40Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2010-02-05T17:41:31Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Hacking OpenSim using MRM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensim-region-module.html updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/MRM.html my article] about accessing OpenSim classes from MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2010-02-05T17:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensim-region-module.html updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hacking-opensim-using-mrm.html my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2010-02-05T17:39:11Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: Undo revision 16792 by Robert d (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hacking-opensim-using-mrm.html my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2010-02-05T17:35:57Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hacking-opensim-using-mrm.html my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Development_Team</id>
		<title>Development Team</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Development_Team"/>
				<updated>2009-06-02T17:21:06Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Additional Developers/Testers/Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
[[Technical Reference | Technical Reference]] -&amp;gt; [[Technical Reference/terms | Terms]] -&amp;gt; [[Development_Team | Core Development Team]]&lt;br /&gt;
&lt;br /&gt;
== Active OpenSim Core Developers ==&lt;br /&gt;
These people have commit access to our central SVN server and are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase.&lt;br /&gt;
** '''Only voted in developers should be listed here, please do not list yourself''' &lt;br /&gt;
(please add in as much info as you like for your name) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Photo &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MW |MW ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darren&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSG:Wright Juran&amp;lt;br/&amp;gt;TN:Darren Guard&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://tribalmedia.se/ Tribal Media AB]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Everything&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:lbsa71|lbsa71]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Stefan Andersson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tribal Skytower&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSG:Stefan Andersson&amp;lt;br/&amp;gt;TN:Stefan Andersson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://tribalmedia.se/ Tribal Media AB]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Integration&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Adam Frisby|Adam Frisby]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Frisby&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Zaius&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;DeepThink Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Terrain, Performance&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MingChen|MingChen]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike/Michael Ortman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ming Chen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 (-5 in Summer)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;DeepThink Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Estate/Parcel Support/Modules/Keeping things all neat and tidy.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt; &lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:SeanDague|sdague]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Sean Dague&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Neas Bade&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Database, Linux, Testing, Misc&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Tedd|Tedd]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Hansen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Maa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Hansen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming/Scripting/Architecture&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ckrinke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charles&amp;amp;nbsp;Krinke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charlesk&amp;amp;nbsp;Bing&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Reliability/Grid servers/ll-functions&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:chi11ken|chi11ken]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff Ames&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Chillken Proto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.genkii.com Genkii]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:adjohn|adjohn]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Johnson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Zeuz Zenovka&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.genkii.com Genkii]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:joha1|joha1]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Johan Berntsson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Joppi Brandenburg&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Performance, packet handling/libSL&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Teravus|Teravus]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Teravus&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Teravus Ousley&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;W3z&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics &amp;amp; Admin tools, A working sim.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:justincc|justincc]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Justin Clark-Casey&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Lulworth Beaumont&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Justin Clark-Casey (osgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Black Dress Technology&amp;lt;br/&amp;gt;[http://justincc.wordpress.com justincc's OpenSim blog]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, performance &amp;amp; reliability, inventory (avatar and object), assets, scenes, etc.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:DrScofield|drscofld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dirk Husemann&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dr Scofield&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Reliability, networking protocols, voice, inventory, assets, remote control, and pretty much everything else :-)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:dahlia|dahlia]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;T. Hoff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dahlia Trimble&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 / -7&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Collision geometry, various math and physics issues, occasional bug fixes and random enhancements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mikem|mikem]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patches, scripting improvements, LSL compiler&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Melanie_T|Melanie_T]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Melanie&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Melanie Milland&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scripting, Prims/Scene, Life, The Universe, and Everything&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:HomerHorwitz|homerh]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Homer Horwitz&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Homer Horwitz&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+2&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rev. engineering, &amp;quot;now, that's funny&amp;quot; problems, but still interested in all parts of it&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Diva|Diva]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Crista Lopes&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Diva Canto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Crista Lopes / Diva Canto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;University of California, Irvine&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Everything, except databases&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:nlin|nlin]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;N Lin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Standard Drucker&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics, scripting, more to come&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:arthursv|arthursv]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Arthur Valadares&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Arthur Valadares&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NONE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-3&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Unit testing, database plugins, bug fixes, general &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Retired OpenSim core developers ==&lt;br /&gt;
&lt;br /&gt;
These people are core developers who have transcended our mortal plane (i.e. they are no longer active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Photo &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:babblefrog|babblefrog]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian McBee&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dogen Coldstream&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Babblefrog Ballistic (osgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Disorganized&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:danx0r|danx0r]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dan Miller&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Albert Pascal&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;squiggle.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PHEEZIKS; everything&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tleiades&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tleiades&amp;amp;nbsp;Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid servers/Database&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Darok|Darok]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darok Kaminski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics engines (especially BulletX)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth / Gwen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Nelson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Ellison&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Nelson (on everywhere but SL)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;BST (UTC+1)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Litesim Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid servers, sim border crossing, avatar animations&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:dalien|dalien]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dalien Talbot&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dalien Talbot&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mostly TCP-based&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Small fixes; rev.eng./prototyping; nightlies; git-keeper &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Alondria]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alondria LeFay&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alondria LeFay (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Implementation of LSL functions and other scripting tidbits.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Developers/Testers/Contributors ==&lt;br /&gt;
These people have contributed bug reports, patches or other contributions to OpenSim. &amp;lt;br&amp;gt;&lt;br /&gt;
'''New comers please add yourself to bottom of the list!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;wikitable sortable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nebadon|Nebadon]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Cerquoni&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nebadon Izumi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nebadon Izumi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-7 Arizona&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Oni Kenkon Creations&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jtclark48|jclark4]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jay Clark&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jay Clarke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics, Grid Host, AI, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:AdamStevenson|BigFootAg]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Stevenson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adamus Petrov&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Texas A&amp;amp;M University&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AI, Skynet, Evolving Systems, Biology&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jeff1564|Jeff1564]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Potter Taurog&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rock_Vacirca&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Colin Withers&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rock Vacirca&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://rock-vacirca.blogspot.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, building, scripting, maintaining an opensim blog.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;simsim&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;caocao&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing whole functions of OpenSim system,working with OpenSim-Engine,reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Vicero Lambert|Vicero Lambert]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Magi|Magi]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andy Agnew&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Magi Merlin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+10&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Spun Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;3D Web Integration, Database stuff and playing with the odds and ends box.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;john_&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;John&amp;amp;nbsp;Moyer&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;VAJohn&amp;amp;nbsp;GeekSquad or&amp;amp;nbsp;Matthew&amp;amp;nbsp;Kendal&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Best&amp;amp;nbsp;Buy/Geek&amp;amp;nbsp;Squad&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tester&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:ClarkZone|ClarkZone]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Admin(@ClarkZone)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Childs&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Admin (ClarkZone)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Http://clarkzone.dyndns.org&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tester and Grid Host&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:aiaustin|aiaustin]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai Austin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai&amp;amp;nbsp;Austin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai&amp;amp;nbsp;AIAI&amp;amp;nbsp;(AIAI Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AIAI,&amp;amp;nbsp;University&amp;amp;nbsp;of&amp;amp;nbsp;Edinburgh&amp;lt;br&amp;gt;http://www.aiai.ed.ac.uk/~ai/&amp;lt;br&amp;gt;http://vue.ed.ac.uk/openvue/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Windows Vista tests&amp;lt;br&amp;gt;Content testing&amp;lt;br&amp;gt;Use of multiple VWs&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marc Manders&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marc Manders&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;marcmanders@gmail.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Creative features&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:balthazar|balthazar]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Trevor Brooks&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Balthazar Sin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Terrains, testing and some small coding tasks&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jimbo2120|jimbo2120]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Osias&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Illuminous Beltran&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, AI, Skynet, coding and testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ZeroPoint&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Guilderoy&amp;amp;nbsp;Dench&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming/Database&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:DerekTang|DerekTang]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Tang&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Timeless&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Tang (ChineseGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://ChineseGrid.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSim communities. In construction...&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:TayB|TayB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Earl B&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Taylor Boyau&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-10&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ViziGrid&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid Host,Networking,Contributions &amp;amp; Testing.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:JamieDav|JamieDav]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamie David&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamie David&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+7&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Forum&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Sim, Avitar, Functionality&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Krtaylor|Krtaylor]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kurt Taylor&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kurt Stringer &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Networking, Monitoring, Scripting, Inventory, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nink|Nink]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Peter Finn&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nink Noonan&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Disruptive Influence.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Bruce|Bruce]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bruce Meerson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bruce Meerson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;HiPiHi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Watching.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Darb|DarbD]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian B. Quinn&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darb Dabney&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;regions&amp;lt;br /&amp;gt;near Marin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PST/SLT (-7 or -8)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;County of Marin, California&amp;lt;br /&amp;gt; http://blog.simgis.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;LiDAR-based sculpties, real-world terrain, &amp;lt;br /&amp;gt;pursuit of civic paraverses &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[CharlieO]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dan&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charlie Omega&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;oobscure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Opensource Obscure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.opensim.it&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;pitman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike Pitman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rez Tone&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;cmu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Christopher Mumme&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Snook Destiny&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.cmu-develop.de/ and research group &amp;quot;Collaboration Systems and CSCW&amp;quot; at Clausthal University of Technology&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing OpenSim, working with OpenSim-Engine, reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Silpol]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andriy Tymchenko&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andy Tir&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;EET (+2/3)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; http://silpol.blogspot.com/ (also visible at Nokia)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Grumly|Grumly]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Forest Klaar&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grumly TheBear&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.NET MCAD Dev/Arch/Trainer http://www.devoteam.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Trying to get into OpenSim code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[daTwitch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;James G. Stallings II&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br&amp;gt;Lazarus Longstaff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Hiro Protagonist (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;House Husband&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSGrid Region owner, OSGrid Operator,&amp;lt;BR&amp;gt;Forum Admin, sometime wiki editor&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;gryc&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Ueusp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Uriza&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Uriza(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PHP scripting, web interfaces, interconnectivity, cross-platformedness&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Phrearch|Phrearch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeroen van Veen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Phrearch Miles&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Phrearch Miles(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Amsterdam/Paris&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;WiXTD, Wikidoc and Moo&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Burnman|Burnman]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Allen Wilkins&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Burnman Bedlam&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Sid Green (United Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Boston, USA&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;United Grid&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:krisbfunk|krisbfunk]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kris Bulman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Krisbfunk Vought&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Krisbfunk Nocturnal(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PE, Canada (-4)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Edactive Technologies&amp;lt;br /&amp;gt;NocturnalEye Productions&amp;lt;br /&amp;gt;UPEI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Currently: Testing, bug reports, wiki updating, building on OSGrid&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[User:HashBox|HashBox]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Sibariel Darkstone&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Sibariel Darkstone (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;New Zealand (+12)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Testing, bug reports, and updating the wiki.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Kinoc|Kinoc]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kino Coursey&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxxon Jaxxon&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxxon Kinoc (OSgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxtron Laboratories &amp;lt;br /&amp;gt; http://www.daxtron.com&amp;lt;br /&amp;gt; University of North Texas&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:trapuh|trapuh]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Pedro Ribeiro&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Vaiten Forder&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;University Student, Escola Superior de Educação de Viseu, Portugal &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:SonicViz|SonicViz]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Paul Cohen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Komuso Tokugawa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Http://sonicviz.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mokele|mokele]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scott Norman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mokelembembe Mokeev&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 (Southern California)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Developer (PHP and MySQL)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that  I can do testing on too.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:devalnor|devalnor]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Devalnor&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;M. Watkin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1 (Belgium)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Small Patch code, bug reports, and updating the wiki.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Ezekiel|Ezekiel]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ezekiel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ezekiel Zabelin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.yosims.com &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL) &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Buggmaster|Buggmaster]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike D&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bug Master&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.adultmetaverse.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Data/Web PHP/PERL/MySQL&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nixnerd|nixnerd]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dangerously Moody&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.integratedtechnologies.eu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Cross Platform Testing, Feedback, Bug Reporting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MoHax|mohax]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mo Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mo Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5 Eastern&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Webmage|webmage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;webmage&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Leyla Masala&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Mage&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, terrain&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:NLStitch|NLStitch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marijn Oosterveld&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Stitch Seale&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NYA&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT +1 Amsterdam&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Twingate Systems (http://www.twingate.nl)&amp;lt;br&amp;gt;HanzeHogeschool Groningen, Netherlands&lt;br /&gt;
  &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming, Photography, AI&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Ideia Boa|Ideia Boa]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Joao Lopes&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ideia Boa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ideia Boa or Boa Ideia in some grids&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GTM+1 Stockholm/Sweden&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;WorldSimTERRA - Virtual World that speaks Portuguese too&amp;lt;br /&amp;gt;http://www.worldsimterra.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing and more testing! Updating the original wiki and translating the OpenSim Wiki into Portuguese and reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Lulurun|lulurun]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;liu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;3Di Inc, Japan &amp;lt;br /&amp;gt;http://www.3di.jp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patches, openid, server performance, UGAI&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Carlosroundel|Carlosrounde]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Carlosroundel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Carlos Roundel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Cyberlandia Italy&amp;lt;br /&amp;gt;http://www.cyberlandia.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, programmer, database, tester&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mikebert|Mikebert]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Strunck&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mikebert Miles&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mikebert M34&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OpenSIM Wiki, Germany&amp;lt;br /&amp;gt;http://www.opensim.de&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Fly-man-|Fly-Man-]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Laurence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Fly Man&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, OpenSimSearch, OpenSimProfile, OpenWiredux&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Taoki&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mircea Kitsune / Taoki Vixen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT +2&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Usually testing and bug reporting but I also make smaller patches where I know what to do.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Patnad|Patnad]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patrick&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patnad Babii&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patnad Babii (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT -5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RezzMe Technologies&amp;lt;br /&amp;gt;http://www.rezzme.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bug testing and reporting, I code C# and have submitted a few patches&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Hallow Palmer|Hallow Palmer]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Markus&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Hallow Palmer&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid4Us&amp;lt;br /&amp;gt;http://www.grid4us.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:^DarkMan|^DarkMan]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian Adair&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patrick Ouachita&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian Adair | Patrick Meta&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 CST&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RealMetaLife | B&amp;amp;H Networking&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing, etc.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:tlaukkan|Tommi Laukkanen]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tommi Laukkanen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tommi Laukkanen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+2 GMT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.bubblecloud.org&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mystical|Mystical]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kevin Tweedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mystical Demina&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mystical Demina&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Extreme Reality Grid&amp;lt;br /&amp;gt;http://www.XRGrid.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL&amp;lt;br/&amp;gt;Enhancements,Commerce, Content,DotNetNuke based portal, development services&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Godfrey|Godfrey]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff Lee&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Warin Cascabel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5 (EST5EDT)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, minor bugfixes. Scripting, building, animating&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Christopher Händler&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai Luik&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai Luik&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Playneko Grid | XIMDEX Jamenai&amp;lt;br /&amp;gt;http://www.playneko.de&amp;lt;br&amp;gt;http://www.ximdex.de&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:bikcmp|bikcmp]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jason&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jake1500 Allen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jason Helios (The Helios Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;EST&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Blue Software&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Search, groups, land, and currency&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt; &lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:mark.malewski|Slipaway]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mark Malewski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Chris Rock&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 (-5 during summer - CDT)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NexTECH / Joopla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web development &amp;amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback. &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;barakademi &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Steve Topp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;barakademi Barzane&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;same avi on  baragrid OSgrid  Grid4us sciencesim&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;utc+1 (CET) paris&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration  php mysql bash nant +++&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:RemedyTomm|RemedyTomm]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tom Grimshaw&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tomm Remedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;KGrid: Casper Warden&lt;br /&gt;
OSGrid: Tomm Remedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;UTC+0 (BST)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Remedy Communications&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Texture pipeline, Groups, ObjectUpdates&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:robert_d|robert_d]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Robert Dzikowski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSGrid: robert_d 13&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;UTC+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://blog.rd-it.net http://blog.rd-it.net]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Region Modules, Tutorials&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
[[Category:Main]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tech Reference]] &lt;br /&gt;
[[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Robert_d</id>
		<title>User:Robert d</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Robert_d"/>
				<updated>2009-06-02T17:20:20Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert Dzikowski, [http://blog.rd-it.net http://blog.rd-it.net]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Development_Team</id>
		<title>Development Team</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Development_Team"/>
				<updated>2009-06-02T17:11:56Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Additional Developers/Testers/Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
[[Technical Reference | Technical Reference]] -&amp;gt; [[Technical Reference/terms | Terms]] -&amp;gt; [[Development_Team | Core Development Team]]&lt;br /&gt;
&lt;br /&gt;
== Active OpenSim Core Developers ==&lt;br /&gt;
These people have commit access to our central SVN server and are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase.&lt;br /&gt;
** '''Only voted in developers should be listed here, please do not list yourself''' &lt;br /&gt;
(please add in as much info as you like for your name) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Photo &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MW |MW ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darren&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSG:Wright Juran&amp;lt;br/&amp;gt;TN:Darren Guard&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://tribalmedia.se/ Tribal Media AB]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Everything&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:lbsa71|lbsa71]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Stefan Andersson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tribal Skytower&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSG:Stefan Andersson&amp;lt;br/&amp;gt;TN:Stefan Andersson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://tribalmedia.se/ Tribal Media AB]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Integration&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Adam Frisby|Adam Frisby]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Frisby&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Zaius&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;DeepThink Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Terrain, Performance&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MingChen|MingChen]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike/Michael Ortman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ming Chen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 (-5 in Summer)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;DeepThink Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Estate/Parcel Support/Modules/Keeping things all neat and tidy.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt; &lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:SeanDague|sdague]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Sean Dague&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Neas Bade&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Database, Linux, Testing, Misc&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Tedd|Tedd]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Hansen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Maa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tedd Hansen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming/Scripting/Architecture&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ckrinke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charles&amp;amp;nbsp;Krinke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charlesk&amp;amp;nbsp;Bing&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Reliability/Grid servers/ll-functions&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:chi11ken|chi11ken]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff Ames&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Chillken Proto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.genkii.com Genkii]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:adjohn|adjohn]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Johnson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Zeuz Zenovka&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.genkii.com Genkii]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:joha1|joha1]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Johan Berntsson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Joppi Brandenburg&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Performance, packet handling/libSL&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Teravus|Teravus]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Teravus&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Teravus Ousley&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;W3z&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics &amp;amp; Admin tools, A working sim.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:justincc|justincc]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Justin Clark-Casey&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Lulworth Beaumont&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Justin Clark-Casey (osgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Black Dress Technology&amp;lt;br/&amp;gt;[http://justincc.wordpress.com justincc's OpenSim blog]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, performance &amp;amp; reliability, inventory (avatar and object), assets, scenes, etc.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:DrScofield|drscofld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dirk Husemann&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dr Scofield&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Reliability, networking protocols, voice, inventory, assets, remote control, and pretty much everything else :-)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:dahlia|dahlia]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;T. Hoff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dahlia Trimble&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 / -7&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Collision geometry, various math and physics issues, occasional bug fixes and random enhancements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mikem|mikem]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patches, scripting improvements, LSL compiler&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Melanie_T|Melanie_T]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Melanie&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Melanie Milland&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scripting, Prims/Scene, Life, The Universe, and Everything&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:HomerHorwitz|homerh]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Homer Horwitz&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Homer Horwitz&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+2&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rev. engineering, &amp;quot;now, that's funny&amp;quot; problems, but still interested in all parts of it&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Diva|Diva]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Crista Lopes&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Diva Canto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Crista Lopes / Diva Canto&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;University of California, Irvine&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Everything, except databases&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:nlin|nlin]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;N Lin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Standard Drucker&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br/&amp;gt;http://www.3di.jp/en/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics, scripting, more to come&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:arthursv|arthursv]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Arthur Valadares&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Arthur Valadares&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NONE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-3&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Unit testing, database plugins, bug fixes, general &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Retired OpenSim core developers ==&lt;br /&gt;
&lt;br /&gt;
These people are core developers who have transcended our mortal plane (i.e. they are no longer active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Photo &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:babblefrog|babblefrog]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian McBee&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dogen Coldstream&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Babblefrog Ballistic (osgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Disorganized&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:danx0r|danx0r]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dan Miller&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Albert Pascal&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;squiggle.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PHEEZIKS; everything&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tleiades&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tleiades&amp;amp;nbsp;Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid servers/Database&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Darok|Darok]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darok Kaminski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics engines (especially BulletX)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth / Gwen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Nelson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Ellison&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gareth Nelson (on everywhere but SL)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;BST (UTC+1)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Litesim Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid servers, sim border crossing, avatar animations&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:dalien|dalien]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dalien Talbot&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dalien Talbot&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mostly TCP-based&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Small fixes; rev.eng./prototyping; nightlies; git-keeper &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td /&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Alondria]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alondria LeFay&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alondria LeFay (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Independent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Implementation of LSL functions and other scripting tidbits.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Developers/Testers/Contributors ==&lt;br /&gt;
These people have contributed bug reports, patches or other contributions to OpenSim. &amp;lt;br&amp;gt;&lt;br /&gt;
'''New comers please add yourself to bottom of the list!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;wikitable sortable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;IRC Nick &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;SL Avatar&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Other Grid&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Time Zone&amp;lt;br&amp;gt;(UTC)&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Org&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Areas of Interest&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nebadon|Nebadon]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Cerquoni&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nebadon Izumi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nebadon Izumi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-7 Arizona&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Oni Kenkon Creations&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jtclark48|jclark4]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jay Clark&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jay Clarke&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Physics, Grid Host, AI, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:AdamStevenson|BigFootAg]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adam Stevenson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Adamus Petrov&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Texas A&amp;amp;M University&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AI, Skynet, Evolving Systems, Biology&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jeff1564|Jeff1564]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Potter Taurog&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rock_Vacirca&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Colin Withers&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rock Vacirca&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://rock-vacirca.blogspot.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, building, scripting, maintaining an opensim blog.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;simsim&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;caocao&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing whole functions of OpenSim system,working with OpenSim-Engine,reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Vicero Lambert|Vicero Lambert]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Magi|Magi]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andy Agnew&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Magi Merlin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+10&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Spun Pty Ltd&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;3D Web Integration, Database stuff and playing with the odds and ends box.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;john_&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;John&amp;amp;nbsp;Moyer&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;VAJohn&amp;amp;nbsp;GeekSquad or&amp;amp;nbsp;Matthew&amp;amp;nbsp;Kendal&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Best&amp;amp;nbsp;Buy/Geek&amp;amp;nbsp;Squad&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tester&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:ClarkZone|ClarkZone]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Admin(@ClarkZone)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Childs&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Troy Admin (ClarkZone)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Http://clarkzone.dyndns.org&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tester and Grid Host&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:aiaustin|aiaustin]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai Austin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai&amp;amp;nbsp;Austin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ai&amp;amp;nbsp;AIAI&amp;amp;nbsp;(AIAI Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AIAI,&amp;amp;nbsp;University&amp;amp;nbsp;of&amp;amp;nbsp;Edinburgh&amp;lt;br&amp;gt;http://www.aiai.ed.ac.uk/~ai/&amp;lt;br&amp;gt;http://vue.ed.ac.uk/openvue/&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Windows Vista tests&amp;lt;br&amp;gt;Content testing&amp;lt;br&amp;gt;Use of multiple VWs&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marc Manders&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marc Manders&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;marcmanders@gmail.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Creative features&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:balthazar|balthazar]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Trevor Brooks&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Balthazar Sin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Terrains, testing and some small coding tasks&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:jimbo2120|jimbo2120]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Osias&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Illuminous Beltran&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, AI, Skynet, coding and testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ZeroPoint&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Guilderoy&amp;amp;nbsp;Dench&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming/Database&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:DerekTang|DerekTang]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Tang&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Timeless&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Derek Tang (ChineseGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://ChineseGrid.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSim communities. In construction...&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:TayB|TayB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Earl B&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Taylor Boyau&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-10&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ViziGrid&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid Host,Networking,Contributions &amp;amp; Testing.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:JamieDav|JamieDav]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamie David&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamie David&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+7&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Forum&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Sim, Avitar, Functionality&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Krtaylor|Krtaylor]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kurt Taylor&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kurt Stringer &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Networking, Monitoring, Scripting, Inventory, Testing&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nink|Nink]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Peter Finn&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nink Noonan&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Disruptive Influence.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Bruce|Bruce]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bruce Meerson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bruce Meerson&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;HiPiHi&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Watching.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Darb|DarbD]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian B. Quinn&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Darb Dabney&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;regions&amp;lt;br /&amp;gt;near Marin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PST/SLT (-7 or -8)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;County of Marin, California&amp;lt;br /&amp;gt; http://blog.simgis.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;LiDAR-based sculpties, real-world terrain, &amp;lt;br /&amp;gt;pursuit of civic paraverses &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[CharlieO]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dan&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Charlie Omega&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;oobscure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Opensource Obscure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.opensim.it&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;pitman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike Pitman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rez Tone&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;cmu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Christopher Mumme&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Snook Destiny&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.cmu-develop.de/ and research group &amp;quot;Collaboration Systems and CSCW&amp;quot; at Clausthal University of Technology&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing OpenSim, working with OpenSim-Engine, reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Silpol]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andriy Tymchenko&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Andy Tir&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;EET (+2/3)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; http://silpol.blogspot.com/ (also visible at Nokia)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Grumly|Grumly]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Forest Klaar&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grumly TheBear&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.NET MCAD Dev/Arch/Trainer http://www.devoteam.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Trying to get into OpenSim code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[daTwitch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;James G. Stallings II&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br&amp;gt;Lazarus Longstaff&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Hiro Protagonist (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;House Husband&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSGrid Region owner, OSGrid Operator,&amp;lt;BR&amp;gt;Forum Admin, sometime wiki editor&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;gryc&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Ueusp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Uriza&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Gryc Uriza(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PHP scripting, web interfaces, interconnectivity, cross-platformedness&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Phrearch|Phrearch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeroen van Veen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Phrearch Miles&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Phrearch Miles(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Amsterdam/Paris&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;WiXTD, Wikidoc and Moo&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Burnman|Burnman]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Allen Wilkins&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Burnman Bedlam&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Sid Green (United Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Boston, USA&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;United Grid&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:krisbfunk|krisbfunk]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kris Bulman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Krisbfunk Vought&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Krisbfunk Nocturnal(OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;PE, Canada (-4)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Edactive Technologies&amp;lt;br /&amp;gt;NocturnalEye Productions&amp;lt;br /&amp;gt;UPEI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Currently: Testing, bug reports, wiki updating, building on OSGrid&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[User:HashBox|HashBox]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Sibariel Darkstone&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Sibariel Darkstone (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;New Zealand (+12)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Testing, bug reports, and updating the wiki.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Kinoc|Kinoc]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kino Coursey&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxxon Jaxxon&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxxon Kinoc (OSgrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Daxtron Laboratories &amp;lt;br /&amp;gt; http://www.daxtron.com&amp;lt;br /&amp;gt; University of North Texas&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:trapuh|trapuh]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Pedro Ribeiro&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Vaiten Forder&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;University Student, Escola Superior de Educação de Viseu, Portugal &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:SonicViz|SonicViz]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Paul Cohen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Komuso Tokugawa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Http://sonicviz.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mokele|mokele]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Scott Norman&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mokelembembe Mokeev&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 (Southern California)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Developer (PHP and MySQL)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that  I can do testing on too.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:devalnor|devalnor]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Devalnor&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;M. Watkin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1 (Belgium)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Small Patch code, bug reports, and updating the wiki.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Ezekiel|Ezekiel]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ezekiel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ezekiel Zabelin&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.yosims.com &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL) &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Buggmaster|Buggmaster]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mike D&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bug Master&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-8 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.adultmetaverse.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, Data/Web PHP/PERL/MySQL&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Nixnerd|nixnerd]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Dangerously Moody&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;None&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.integratedtechnologies.eu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Cross Platform Testing, Feedback, Bug Reporting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:MoHax|mohax]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mo Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mo Hax&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5 Eastern&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Webmage|webmage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;webmage&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Leyla Masala&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web Mage&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;IBM&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, terrain&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:NLStitch|NLStitch]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marijn Oosterveld&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Stitch Seale&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NYA&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT +1 Amsterdam&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Twingate Systems (http://www.twingate.nl)&amp;lt;br&amp;gt;HanzeHogeschool Groningen, Netherlands&lt;br /&gt;
  &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Programming, Photography, AI&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Ideia Boa|Ideia Boa]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Joao Lopes&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ideia Boa&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ideia Boa or Boa Ideia in some grids&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GTM+1 Stockholm/Sweden&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;WorldSimTERRA - Virtual World that speaks Portuguese too&amp;lt;br /&amp;gt;http://www.worldsimterra.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing and more testing! Updating the original wiki and translating the OpenSim Wiki into Portuguese and reporting on OpenSim&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Lulurun|lulurun]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;liu&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;3Di Inc, Japan &amp;lt;br /&amp;gt;http://www.3di.jp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patches, openid, server performance, UGAI&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Carlosroundel|Carlosrounde]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Carlosroundel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Carlos Roundel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Cyberlandia Italy&amp;lt;br /&amp;gt;http://www.cyberlandia.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid, programmer, database, tester&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mikebert|Mikebert]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Michael Strunck&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mikebert Miles&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mikebert M34&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OpenSIM Wiki, Germany&amp;lt;br /&amp;gt;http://www.opensim.de&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Fly-man-|Fly-Man-]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Laurence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Fly Man&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, OpenSimSearch, OpenSimProfile, OpenWiredux&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Taoki&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mircea Kitsune / Taoki Vixen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT +2&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Usually testing and bug reporting but I also make smaller patches where I know what to do.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Patnad|Patnad]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patrick&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patnad Babii&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patnad Babii (OSGrid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;GMT -5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RezzMe Technologies&amp;lt;br /&amp;gt;http://www.rezzme.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bug testing and reporting, I code C# and have submitted a few patches&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Hallow Palmer|Hallow Palmer]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Markus&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Hallow Palmer&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Grid4Us&amp;lt;br /&amp;gt;http://www.grid4us.net&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:^DarkMan|^DarkMan]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian Adair&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Patrick Ouachita&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Brian Adair | Patrick Meta&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 CST&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RealMetaLife | B&amp;amp;H Networking&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Building, Scripting, Testing, etc.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:tlaukkan|Tommi Laukkanen]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tommi Laukkanen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tommi Laukkanen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+2 GMT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://www.bubblecloud.org&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Mystical|Mystical]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Kevin Tweedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mystical Demina&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mystical Demina&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Extreme Reality Grid&amp;lt;br /&amp;gt;http://www.XRGrid.com&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL&amp;lt;br/&amp;gt;Enhancements,Commerce, Content,DotNetNuke based portal, development services&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:Godfrey|Godfrey]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jeff Lee&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Warin Cascabel&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-5 (EST5EDT)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Testing, minor bugfixes. Scripting, building, animating&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Christopher Händler&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai Luik&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jamenai Luik&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Playneko Grid | XIMDEX Jamenai&amp;lt;br /&amp;gt;http://www.playneko.de&amp;lt;br&amp;gt;http://www.ximdex.de&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:bikcmp|bikcmp]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jason&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jake1500 Allen&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jason Helios (The Helios Grid)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;EST&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Blue Software&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Search, groups, land, and currency&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt; &lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:mark.malewski|Slipaway]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Mark Malewski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Chris Rock&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;-6 (-5 during summer - CDT)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;NexTECH / Joopla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Web development &amp;amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback. &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;barakademi &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Steve Topp&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;barakademi Barzane&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;same avi on  baragrid OSgrid  Grid4us sciencesim&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;utc+1 (CET) paris&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration  php mysql bash nant +++&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:RemedyTomm|RemedyTomm]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tom Grimshaw&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tomm Remedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;KGrid: Casper Warden&lt;br /&gt;
OSGrid: Tomm Remedy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;UTC+0 (BST)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Remedy Communications&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Texture pipeline, Groups, ObjectUpdates&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[User:robert_d|robert_d]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Robert Dzikowski&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;OSGrid: robert_d 13&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;UTC+1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[http://blog.rd-it.net blog.rd-it.net]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Region Modules, Tutorials&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
[[Category:Main]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tech Reference]] &lt;br /&gt;
[[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T23:10:56Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Hacking OpenSim using MRM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hacking-opensim-using-mrm.html my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules</id>
		<title>Talk:Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T22:42:15Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: Removing all content from page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T06:52:05Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]]&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hackingopensimusingmrm my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T06:47:21Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hackingopensimusingmrm my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T06:46:36Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Hacking OpenSim using MRM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hackingopensimusingmrm my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-26T06:45:53Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
=== Hacking OpenSim using MRM ===&lt;br /&gt;
Check out [http://blog.rd-it.net/hackingopensimusingmrm my article] about accessing OpenSim classes from the MRM script.&lt;br /&gt;
--[[User:Robert d|Robert d]] 06:45, 26 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/IRegionModule</id>
		<title>IRegionModule</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/IRegionModule"/>
				<updated>2009-05-11T00:12:09Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Accessible Objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Region modules are .net/mono dlls. During initialization of the simulator, the current directory (/bin) and the scriptengines (/ScriptEngines) directory are scanned for dlls, in an attempt to load region modules stored there.&lt;br /&gt;
&lt;br /&gt;
Region modules execute within the heart of the simulator. Typically region modules register for a number of events, e.g. chat messages, user logins, texture transfers, and take what ever steps are appropriate for the purposes of the module.&lt;br /&gt;
&lt;br /&gt;
Region Modules require a few basic things:&lt;br /&gt;
* The Base Interface &lt;br /&gt;
* Some callbacks for OpenSim events&lt;br /&gt;
&lt;br /&gt;
== The Base Interface ==&lt;br /&gt;
All region modules must implement this interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public interface IRegionModule&lt;br /&gt;
{&lt;br /&gt;
    void Initialise(Scene scene, IConfig config);&lt;br /&gt;
    void PostInitialise();&lt;br /&gt;
    void Close();&lt;br /&gt;
    string Name { get; }&lt;br /&gt;
    bool IsSharedModule { get; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Initialise&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This method is called immediately after the region module has been loaded by the sim. At this time the module is passed a reference to the scene contained within the sim. The region module should store this reference for later use. Care should be taken, not to depend on the scene and/or sim being fully loaded and running at this time.  &lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PostInitialise&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Once the sim is fully initialized and all region modules have been loaded, the sim will invoke PostInitialize on all loaded region modules. At this point the sim will be fully operational, and it should be safe to invoke any method on the scene. &amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; PostInitialize will not be invoked on shared modules for regions created via XmlRpcCreateRegion or via the console command &amp;quot;create-region&amp;quot;!&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Close&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This method will be invoked when the sim is closing down.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name is shown when the console command &amp;quot;show modules&amp;quot; is ran. It's should be a nice name like &amp;quot;Sim Chat Module&amp;quot; or &amp;quot;The Best Region Module Ever&amp;quot;.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;IsSharedModule&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The simulator process (OpenSim.exe) supports running multiple regions (internally, a Scene object) on a single simulator process. If this returns True, the module will only be loaded once and Initialize will be called for each Scene being simulated. If false, a separate copy of your RegionModule will be created for each Scene.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base interface doesn't give you much beyond a piece of loaded code.  In order to do anything useful you'll need to use a combination of events and object crawling through scene.&lt;br /&gt;
&lt;br /&gt;
== Accessible Objects ==&lt;br /&gt;
&lt;br /&gt;
'''Note:''' these are internal interfaces, and will change in the future, probably for the better.  We expect these to  stabilize over time, but for now this point in time snapshot is probably helpful.&lt;br /&gt;
&lt;br /&gt;
In the '''Initialise''' routine you get access to the scene object for the region, from here you can spider down into the scene and get access to many other objects of interest.&lt;br /&gt;
&lt;br /&gt;
* scene.GetEntities() - returns a list of all the Entities in the environment.  This will be a combined list of SceneObjectGroups (prim sets) and ScenePresences (avatars).&lt;br /&gt;
* scene.GetAvatars() - get only the avatars in the scene (very handy for sending messages to clients)&lt;br /&gt;
* scene.EventManager - this is the object from which you can register callbacks for scene events.  Some examples provided in a little bit&lt;br /&gt;
* scene.RegionInfo - properties about the region&lt;br /&gt;
&lt;br /&gt;
== Registering for Events ==&lt;br /&gt;
&lt;br /&gt;
Taking the [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs?view=markup SunModule] as an example we can see the following code:&lt;br /&gt;
&lt;br /&gt;
In Initialise():&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
m_scene.EventManager.OnFrame += SunUpdate;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Pretty simple, we just got the EventManager and registered the SunUpdate method as a callback for the OnFrame event.  OnFrame is triggered every time there is a render frame in opensim, which is about 20 times per second.  If you are firing on the OnFrame event you need to do something small, or punt most of the time, as you'll negatively impact the performance of the system otherwise.&lt;br /&gt;
&lt;br /&gt;
Now, for that function...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public void SunUpdate()&lt;br /&gt;
{&lt;br /&gt;
    // this code just means only do this on every 1000th frame, and don't do it if the sun is in a fixed possition&lt;br /&gt;
    if (((m_frame++%m_frame_mod) != 0) || !ready || sunFixed)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    GenSunPos();        // Generate shared values once&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;ScenePresence&amp;gt; avatars = m_scene.GetAvatars();&lt;br /&gt;
    foreach (ScenePresence avatar in avatars)&lt;br /&gt;
    {&lt;br /&gt;
        if (!avatar.IsChildAgent)&lt;br /&gt;
            avatar.ControllingClient.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // set estate settings for region access to sun position&lt;br /&gt;
    m_scene.RegionInfo.RegionSettings.SunVector = Position;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SunUpdate() takes no parameter (some events may require them).  It only fires every 1000th frame by default (m_frame_mod = 1000 in this module), so it doesn't take too many cycles.&lt;br /&gt;
&lt;br /&gt;
In order for the sun position to change for the clients, they need to be told that it changes.  This is done by getting a list of all the Avatars from the scene, then sending the Sun Position to each of them in turn.  It is important to check to see if the avatar is a ChildAgent, otherwise you will generate zombies in opensim world.&lt;br /&gt;
&lt;br /&gt;
== Where to go from here ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting Started with Region Modules]] -- the Hello World of OpenSim application development&lt;br /&gt;
* Read the source for existing opensim core modules.  You can do it here via [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Modules view svn].&lt;br /&gt;
* Read the source for [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Scenes/EventManager.cs?view=markup EventManager].  It will tell you what events exist.&lt;br /&gt;
* Help write more examples here.  OpenSim grows with your contributions.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Robert_d</id>
		<title>User:Robert d</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Robert_d"/>
				<updated>2009-05-10T19:42:49Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert Dzikowski, email: blog@rd-it.net&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Robert_d</id>
		<title>User:Robert d</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Robert_d"/>
				<updated>2009-05-10T19:42:28Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: New page: Robert Dzikowski email: blog@rd-it.net&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert Dzikowski&lt;br /&gt;
email: blog@rd-it.net&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Talk:Screenshots</id>
		<title>Talk:Screenshots</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Talk:Screenshots"/>
				<updated>2009-05-10T19:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: New page: Where can I find more info about drawing on prims using a Browser Silverlight applet?  --~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Where can I find more info about drawing on prims using a Browser Silverlight applet?&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 19:40, 10 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules</id>
		<title>Talk:Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules"/>
				<updated>2009-05-09T22:18:53Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 22:03, 9 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-09T22:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://blog.rd-it.net/opensimregionmodule updated project] from my blog.&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-09T22:10:14Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Update for OpenSim 0.6.4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://rdzikowski.googlepages.com/opensimregionmodule updated project] from my blog.&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Getting_Started_with_Region_Modules</id>
		<title>Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Getting_Started_with_Region_Modules"/>
				<updated>2009-05-09T22:08:59Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: /* Tips */ updated for OpenSim 0.6.4.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello World ==&lt;br /&gt;
&lt;br /&gt;
This brief tutorial is intended to get people started with developing applications with/for opensim using [[IRegionModule|region modules]] and the [http://docs.opensimulator.org/namespaceOpenSim.html opensim API]. This approach to developing virtual world applications, unique to OpenSim, is a powerful alternative to the well-known inworld scripting approach.&lt;br /&gt;
The very simple module available here writes &amp;quot;HELLO&amp;quot; with prims on every region of your opensim instance, and makes them move every 2 seconds or so. Please note:&lt;br /&gt;
&lt;br /&gt;
* The opensim API is rapidly changing. The code available in this example has been written and tested for opensim release 0.6.0, which corresponds to SVN 7176. The example has also been tested for a more recent stable version, SVN 7320. You are encouraged to use 7176, if possible.&lt;br /&gt;
* You are also encouraged to try this code on the default standalone region first before running on a grid. &lt;br /&gt;
* The resulting dll will run both in Windows and Linux, but the building environment is assumed to be VC# on Windows. Users of other operating systems will be able to follow, though.&lt;br /&gt;
&lt;br /&gt;
To get started:&lt;br /&gt;
&lt;br /&gt;
# Download and install opensim (preferably 7176), and build it as normal. Run it once, so you create a default region and a default user. Then shut it down.&lt;br /&gt;
# Get this zip file: http://www.ics.uci.edu/~lopes/opensim/HelloWorld-current.zip. Unzip it somewhere.&lt;br /&gt;
# Before you go changing the code of the application, see its effect inworld by doing this:&lt;br /&gt;
#* Grab HelloWorld/bin/Release/HelloWorld.dll and dump it in opensim/bin&lt;br /&gt;
#* Start opensim as normal, and login to it.&lt;br /&gt;
&lt;br /&gt;
You should see the word HELLO spelled out in prims, and moving every so often.&lt;br /&gt;
&lt;br /&gt;
[[image:Hello 001.jpg|220px|left|thumb|Hello]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are you ready to explore the code now?&lt;br /&gt;
&lt;br /&gt;
Hold on. Before we do that, let me give you the 30-second introduction to Visual C#. Visual C# is similar to Eclipse, if you ever used that. When it builds, it places the resulting dll or exe in whatever folder you tell it to (right-click on the project-&amp;gt;properties). By default it places them in bin/Release. When you compile it with debugging, that goes into bin/Debug. In spirit, the dll is equivalent to a jar file. That's what you want to produce and pass around. The PDB file can be ignored, unless you want to debug. The HelloWorld example uses the defaults of VC#, so every time you build it without debugging, the dll is placed under HelloWorld/bin/Release. To build without debugging information, simply right-click on the solution in the Solution Explorer window and choose Build.&lt;br /&gt;
&lt;br /&gt;
Another note: the solution file included in the zip is for VC# 2005. If you have VC# 2008 that's fine too. Just double-click on the solution file, and VC# 2008 will convert the whole thing.&lt;br /&gt;
&lt;br /&gt;
And now for the linux/mac/unix folk:&lt;br /&gt;
We now have a nant default.build file included in the tutorial zip - just drop it in the same directory with the source. Note that for everything to go well, you will need to park your module source directory inside opensim/bin/. When you are ready to build, open a shell, change to the module source directory, and then run 'nant' without any args.&lt;br /&gt;
&lt;br /&gt;
OK, now we're ready. Go ahead and double-click HelloWorld.sln.&lt;br /&gt;
&lt;br /&gt;
The only class in this example is called HelloWorldModule. I know you're eager to get to the part where objects are created and moved around, but I'm afraid that's the easy part. In order to be able to write those functions effectively, you will need to understand a lot more of the engineering of these modules, and that's the part that's not so trivial, especially if you aren't familiar with VC#. So let me go through the code very slowly.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
 &lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
 &lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Environment;&lt;br /&gt;
using OpenSim.Region.Environment.Interfaces;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This first part consists of a collection of &amp;quot;using&amp;quot; declarations. If you come from Java, those declarations are equivalent to &amp;quot;import&amp;quot; declarations. And you know what that means in Java: the jar files must be reachable for compilation to succeed. Same here: the dlls for those elements must be reachable for this project to build. Luckily for you, I have included those dlls in the zip file, so you don't need to add them. They are all happily bundled in HelloWorld/bin/Release. Go ahead and look there. However, as you start getting cozy with this code and you start wanting more, more, more, you will need more from the OpenSim API and even from other libraries. When that comes, you will need to add more dlls to your project. That is done through VC#, not on the file system directly! To add libraries (&amp;quot;References&amp;quot;), right-click on &amp;quot;References&amp;quot; in the Solution Explorer, and choose &amp;quot;Add Reference&amp;quot;. A small window will pop up with a few tabs. If the library you need is under the System namespace, you want to interact with the .NET tab. If the library you need is from OpenSim you need to interact with the &amp;quot;Browse&amp;quot; tab; then, navigate to your installation of opensim bin, and pick the dlls you need. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace HelloWorld&lt;br /&gt;
{&lt;br /&gt;
    public class HelloWorldModule : IRegionModule&lt;br /&gt;
    {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This second part is the namespace and class declaration. The only noteworthy thing here is the &amp;quot;: IRegionModule&amp;quot; part. What that means is that our class HelloWorldModule implements the [[Region Modules|IRegionModule]] interface, which means that we have to implement the 5 methods of that interface, namely: Initialise (yes, it's the British spelling...), PostInitialise, Close, Name, and IsSharedModule. But that's not all. OpenSim treats IRegionModule classes in a very special way. When OpenSim starts, it looks into all the dlls it can reach (under its bin) in search for classes that implement the IRegionModule interface. All of those classes are then acquired and run by OpenSim as if they were part of OpenSim. &lt;br /&gt;
&lt;br /&gt;
And this is the key to OpenSim application development: you can add your own code, or somebody else's code, as a plug-in that runs natively on the server. Yeepie!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This third block above is the declaration of the m_log variable. This variable helps us output messages into a log. I'm just using a common idiom that is used all over OpenSim and that uses log4net. If you come from Java, I'm sure this rings a bell... if you've never seen this, you don't need to understand it, just use it to output messages both onto the console and onto the OpenSim.log file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; scene_prims = new Dictionary&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
int counter = 0;&lt;br /&gt;
bool positive = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fourth block of code is the declaration of a few instance variables for our HelloWorld example, and this is where we start getting acquainted with the OpenSim API. &lt;br /&gt;
* m_scenes will hold references to all the scenes. &amp;quot;What's a scene?&amp;quot;, I hear you asking. A scene is OpenSim's representation of the contents of a region. If your opensim has only one region, there will be only one scene object; if it has more, there will be as many.&lt;br /&gt;
* scene_prims is a dictionary that associates scenes with a list of objects of type SceneObjectGroup. In the Java world this would probably be a Hashtable; in the .NET world it's a Dictionary. scene_prims will hold references to the prims that we will instantiate for constructing the world HELLO in each scene. An important note: if you look inside OpenSim's Scene class, you will see that it has a list of entities corresponding to all objects and avatars present in the scene. As we place prims in scenes, including these HELLO prims, they will be placed on that list. However, what we are doing here is constructing a set of prims that are special for our application and that we want to track throughout our application; they are our managed prims. As such, we want to hold references to those, and only those. That's what scene_prims is for.&lt;br /&gt;
* The other two variables, counter and positive, are explained later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#region IRegionModule interface&lt;br /&gt;
 &lt;br /&gt;
public void Initialise(Scene scene, IConfigSource config)&lt;br /&gt;
{&lt;br /&gt;
    m_log.Info(&amp;quot;[HELLOWORLD] Initializing...&amp;quot;);&lt;br /&gt;
    m_scenes.Add(scene);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void PostInitialise()&lt;br /&gt;
{&lt;br /&gt;
    m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick);&lt;br /&gt;
    foreach (Scene s in m_scenes)&lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void Close()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public string Name&lt;br /&gt;
{&lt;br /&gt;
    get { return &amp;quot;Hello World Module&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public bool IsSharedModule&lt;br /&gt;
{&lt;br /&gt;
    get { return true; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fifth block is the implementation of the IRegionModule methods. There's nothing much here, and this is how it should be: encapsulate all of your code in your own functions. Let's go through the most important of these methods:&lt;br /&gt;
* Initialise (I still can't get over this British spelling): this method is called by OpenSim when it is discovering all the IRegionModule classes in dlls. OpenSim sends us two parameters: a scene object and a configuration object. The configuration object allows us to browse through the OpenSim configuration, if we need that info. The scene object is the very important scene information that we want to hold on to; the scene object is our code's main link to OpenSim, it's how we get to access and modify things in the world and beyond. So the main thing our Initialise method does is to hold on to the scene object that OpenSim sends us.&lt;br /&gt;
* PostInitialise (argh, British spelling again): this method is called by OpenSim once everything is ready to go, that is, after OpenSim has properly set all the internal things it needs to set. You should look at PostInitialise as the Main method of our application modules. In this case, we are doing two things:&lt;br /&gt;
** We are subscribing to an OpenSim event called OnFrame. This event is the Heartbeat of the simulator, so if our module is to do things periodically, we may want to tag along this heartbeat. We are going to move the word HELLO periodically, that's why we're subscribing to this event. Note that this is not always the best approach, though. The simulator is a busy bee, and has to do lots of things already without our module being there. Tagging along the simulator's heartbeat means that we're making it do more stuff. If you're planning to develop modules with your own simulations, you're much better off defining your own timer object, because that will make the tick function run on a different thread than the simulator's heartbeat. But in this case, this is just HelloWorld, so we can abuse gently.&lt;br /&gt;
** For each scene, we are constructing the HELLO word.&lt;br /&gt;
* Close and Name are trivial -- see the [[IRegionModule|documentation]].&lt;br /&gt;
* IsSharedModule is very important, and may be a source of much grief. Here's the deal: OpenSim can either (a) instantiate our HelloWorldModule class exactly once, a singleton, independent of the number of regions; or (b) instantiate our HelloWorldModule class as many times as the number of regions, creating a different HelloWorldModule instance for every scene. These two modes are captured by the IsSharedModule method. If you want OpenSim to create a singleton, make this method return true (&amp;quot;yes, OpenSim, my module is shared&amp;quot;); if you want to create different instances for different regions, make this method return false (&amp;quot;no, OpenSim, my module is not shared among the regions&amp;quot;). Depending on your application, you may want one thing or the other. In this case, I want to centralize the management of my specially constructed prims, so I made it be shared. (In reality for this simple example, it wouldn't matter). But here's the important idiom: when you have a shared module, you want to have a list of scenes, just like the m_scenes variable in this example; when you have a non-shared module, you want to have only one scene variable declared in your module, so that would be &amp;quot;Scene m_scene;&amp;quot; instead of &amp;quot;List&amp;lt;Scene&amp;gt; m_scenes;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alright! If you read up to here, and followed the story, you're now ready to move on to the fun part.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void DoHelloWorld(Scene scene)&lt;br /&gt;
{&lt;br /&gt;
    // We're going to write HELLO with prims&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;SceneObjectGroup&amp;gt; prims = new List&amp;lt;SceneObjectGroup&amp;gt;();&lt;br /&gt;
    // First prim: |&lt;br /&gt;
    Vector3 pos = new Vector3(120, 128, 30);&lt;br /&gt;
    SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());&lt;br /&gt;
    sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f);&lt;br /&gt;
    prims.Add(sog);&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    // Add these to the managed objects&lt;br /&gt;
    scene_prims.Add(scene, prims);&lt;br /&gt;
&lt;br /&gt;
    // Now place them visibly on the scene&lt;br /&gt;
    foreach (SceneObjectGroup sogr in prims)&lt;br /&gt;
    {&lt;br /&gt;
        scene.AddNewSceneObject(sogr, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method creates 12 SceneObjectGroup (SOG) instances corresponding to the 12 segments that constitute the word HELLO. '''BIG WARNING:''' SOG is currently under heavy redesign, and may be replaced with another class altogether in future versions of opensim. But for 0.6.0 SOG is tha man. SOG represents a linked group of objects, the linksets in SL, with root part and all. If you have your VC# open with HelloWorld, go to this method, and type, somewhere: sog. -- just like that, stopping at the dot. VC# will show you everything that is inside SOG instances. And that is A LOT! It's one of those monster classes! (and that's the reason why it's being redesigned) You should spend some time exploring what's inside SOG. In this example, I'm only using a couple of things: one of the constructors and the RootPart. For the RootPart, I'm only setting its Scale, i.e. the size of the prim.&lt;br /&gt;
&lt;br /&gt;
At the end of this method, when all prims are instantiated, they're added to the list of managed prims (scene_prims) and they're finally made visible on the scene, by calling scene.AddNewSceneObject. The second argument to this method, false, means that we're telling OpenSim not to back these objects up on the DB; we want them to be non-persistent.&lt;br /&gt;
&lt;br /&gt;
And finally we come to the end of the application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
void OnTick()&lt;br /&gt;
{&lt;br /&gt;
    if (counter++ % 50 == 0)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (KeyValuePair&amp;lt;Scene, List&amp;lt;SceneObjectGroup&amp;gt;&amp;gt; kvp in scene_prims)&lt;br /&gt;
        {&lt;br /&gt;
            foreach (SceneObjectGroup sog in kvp.Value)&lt;br /&gt;
            {&lt;br /&gt;
                if (positive)&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(5, 5, 0);&lt;br /&gt;
                else&lt;br /&gt;
                    sog.AbsolutePosition += new Vector3(-5, -5, 0);&lt;br /&gt;
                sog.ScheduleGroupForTerseUpdate();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        positive = !positive;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the worker method in our application for every heartbeat of the simulator. Notice that I have a counter there so that things only move every 50 heartbeats. I also have a direction (positive) that can be true or false, so that the prims move back and forth. As you can see, the way to move prims is to set their AbsolutePosition property directly. After that, we tell opensim to schedule the object for an update, so that we can see it move. Note this last bit, the scheduling for updates, is still a fragile piece of the opensim API; we may need it here or not, depending on the version of opensim you're using.&lt;br /&gt;
&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
Running on custom configurations (grids, alternate terrain) should work fine if you take into account the following:&lt;br /&gt;
&lt;br /&gt;
# Make sure that the Z value in the C# code is above the terrain. Instead of 30,you may wish to raise or lower this value. Make sure to also modify 29 and 31, similarly.&lt;br /&gt;
# Change UUID.Zero to your a UUID for an avatar that has build rights on your region. You can replace &amp;quot;UUID.Zero&amp;quot; with &amp;quot;new UUID(&amp;quot;your UUID string here&amp;quot;)&amp;quot;&lt;br /&gt;
# This C# module will place &amp;quot;HELLO&amp;quot; on each region in your grid. If you want to make it so that &amp;quot;HELLO&amp;quot; appears in only one region, try this quick replacement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
foreach (Scene s in m_scenes)&lt;br /&gt;
    if (s.RegionInfo.RegionName == &amp;quot;YourRegionName&amp;quot;) &lt;br /&gt;
        DoHelloWorld(s);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What Next ===&lt;br /&gt;
&lt;br /&gt;
This is an [http://www.youtube.com/watch?v=Xxsk9WDYMtg example]&lt;br /&gt;
of 100 continuously moving blocks.&lt;br /&gt;
&lt;br /&gt;
Here are some other suggestions for what you can do next, on your own:&lt;br /&gt;
&lt;br /&gt;
* Change the Color of the prims&lt;br /&gt;
* Complete the example by creating prims for the word WORLD. For the W you probably need our beloved quaternions...&lt;br /&gt;
* Add more regions to your opensim and see what happens&lt;br /&gt;
* Change this module from shared to non-shared and see what happens (nothing much different, one hopes, in this simple case)&lt;br /&gt;
* Be more creative with the movement and make the prims move in circles&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Remember, every time you make changes to the application code, and you build it, its dll is placed under bin/Release, so you have to copy it to opensim/bin. If you want, you can change the build settings of your application, so that it places the dll directly in opensim/bin.&lt;br /&gt;
&lt;br /&gt;
Have Fun!&lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
&lt;br /&gt;
There is very little documentation about the OpenSim API. One of the reasons for that is that it is still evolving and therefore unstable. A reasonable place to look at the API is http://docs.opensimulator.org/namespaceOpenSim.html; in there, the most interesting place to start is the Region.Environment.Scenes namespace http://docs.opensimulator.org/namespaceOpenSim_1_1Region_1_1Environment_1_1Scenes.html.&lt;br /&gt;
&lt;br /&gt;
The code itself is full of information, if you can cope with looking at too much information. Here's what I do and recommend: when you're developing these modules, have 2 VC# open, one with your application and the other with opensim. My experience with opensim is that the names of things are quite reasonable. So whenever you want something that you don't know exactly how to get, go to the opensim code and make heavy use of the Search functions, especially Edit-&amp;gt;Find and Replace-&amp;gt;Find in Files. VC#, just like Eclipse, also has those wonderful navigation facilities that take you to definitions from calls, etc. Just right-click on things in the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update for OpenSim 0.6.4.1 ===&lt;br /&gt;
&lt;br /&gt;
To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://rdzikowski.googlepages.com/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 22:03, 9 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules</id>
		<title>Talk:Getting Started with Region Modules</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Talk:Getting_Started_with_Region_Modules"/>
				<updated>2009-05-09T22:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;Robert d: Updated for OpenSim 0.6.4.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To compile and run this example in OpenSim 0.6.4.1 you have to change using statements&lt;br /&gt;
to this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using log4net;&lt;br /&gt;
using Nini.Config;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will also have to add references to all those libraries and OpenMetaverseTypes library,&lt;br /&gt;
or you can download [http://rdzikowski.googlepages.com/opensimregionmodule updated project] from my blog.&lt;br /&gt;
&lt;br /&gt;
--[[User:Robert d|Robert d]] 22:03, 9 May 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robert d</name></author>	</entry>

	</feed>