Building learning modules

This article describes how you as a teacher can build your own virtual world learning modules with your students, using the Adaptive Learning System OpenSimulator add-on from the Oligo Academy tools suite.

The Oligo Dashboard tools allows teachers to control virtual world regions and load different learning modules in them.  Students can then login to a virtual world using the FireStorm or Singularity viewer and teachers can follow their activities and learning experience in the Dashboard.

We recommend all students and teachers that want to developer their own learning modules install the following tools:


FireStorm viewer Best viewer for building 3D design in-world with other students
Visual Studio Code Code editor with plugins for LSL scriting and FireStorm LSL preprocessor
Blender Free professional 3D design tool, that can be used to import any free 3D model you find on the Internet and convert it to COLLADA (COLLAborative Design Activity), which is an interchange file format for interactive 3D applications.


Normally only teachers (superusers) , principals (administrators) or a few tech-savvy students acting on behalf of the teacher have access to the Oligo Dashboard, but all students can install the Oligo Academy tools on their laptop, if they want to run an OpenSimulator on their laptop and work at home on designing their own virtual world.


We can provide you with a free render server web application, that your IT department can install on a Windows server, to give students an easy web interface to convert 3D models to Collada or STL for 3D print, if you don’t want your students to get overwhelmed by the Blender application. But teaching students to only use Blender for file import and export is fine for most any student, so that is what we recommend you start with.


Getting started designing your virtual world

After installing the Oligo Academy tools as described in the article How to install, you as a teacher can start OpenSimulator on your laptop using the Oligo trayicon. The teachers laptop will now act as server for your in-class students. Students from other classes can also connect to your simulator, as long as they are on the same local area network. Student only need to install the FireStorm viewer to connect to a virtual world server learning module or make 3D design in-world.

If you want to work on building a learning module together with another school in an international school project, you must read the article on installing OpenSimulator in grid mode on a real server, that also describes how to install the Oligo Academy OpenSimulator add-ons and Dashboard manually on a grid server. Students from different countries can learn reading and writing a foreign language in the viewer chat to communicate about what to build in a virtual world.

When designing a virtual world make sure students can navigate the learning module using in-world teleport boards to landmarks, even through some add-on chat commands  can be found writing “/9 help” in the FireStorm viewer chat. For students the chat should be all about communicating with other students and then in-world information boards or media on a prim pointing to external web content, should explain have they navigate the learning module.

If you implement a Head Up Display (HUD) as an 3D object that is always visible on the screen, you should use it only for showing student progress or points and not as something the students interact with for navigating the virtual world.

The students should focus on the learning module and not the viewer, therefore I hope in the future new viewers like the OnLook viewer or browser based viewers will be available. But for now just install FireStorm or Singularity viewer and instruct your students not to spend all their time dressing up their avatar.



Login to Dashboard and prepare a region

To login in to the dashboard you must specify the simulator server URL like localhost:9080 on your laptop.

For an OpenSimulator in grid mode you would ask your IT department to install the server and use a real domain like and then install a reverse proxy like Apache HTTP server, to internally call, to avoid firewall issues using ports other than standard HTTP (port 80).

When you are logged in to your Dashboard you must choose one of the regions Oligo, Region1, Region2, etc. depending what size you want your virtual world to be. You should then press Delete on the region to load an empty region file. If you don’t want to start from scratch you could download a free OpenSimulator archive (OAR) file made by Linda Kellie Henson for a region size of 256×256. When you download these free region files their extension i .tgz, which you must change to .oar, before trying to load it in the Dashboard.

On a standalone OpenSimulator you can use the Oligo Dashboard to create user accounts under Groups, but for an OpenSimulator in grid mode, you should ask your IT department to execute “create user” statements for each student in the Robust command line console.

The Master Avatar user that was the first user created, is used for storing landmarks and other inventory information shared for all students that login to a given region. When you load a new learning module in a region old landmarks for that region are deleted and any new landmarks defined in an .iar file for the learning module are stored in the user Master Avatars inventory under landmarks.



Packaging your learning module and sharing it with other schools

If your learning module is only the OpenSimulator archive file, then you can just share the .OAR file. But if your learning module supports multiple languages, has a Heads Up Display or other learning material, then create a folder structure like in the example below and compress it to a ZIP file called, before sharing it with other teachers and students.


The dictionary file with translations is a comma separated file (.CSV), you can edit in an Excel spreadsheet or a simple text editor. The OpenSimulator Inventory Archive file (.IAR) will default load the inventory items, to the Master Avatar users inventory.

When users login to a region, the OpenSimulator add-on check if we need to copy a Heads Up Display to the users inventory from Master Avatar. Landmarks loaded to Master Avatar will become teleport points in the learning module, allowing students to jump between learning areas in a virtual world.

Master Avatars landmarks for a given region are shown on the map of active users in the Dashboard, to make it easy for the teacher to see were students are in the virtual world.

Most learning modules don’t need a Heads Up Display, but an example hud.iar file can be found in the OpenSimulator add-on module data objects folder bin/addon-modules/AdaptiveLearningSystem/data/objects. In the same folder you will also find OligoAvatars.iar that has body shapes and textures, that allow students avatar to look like cute alians. You can read more on making Avatars on the wiki. The OSAvatar site is not up to date, but the licence states these avatars are free for educational and non commercial purposes and you might be able to find a copy of the IAR file online.



Viewer chat command list

To support student to student learning the OpenSimulator Adaptive Learning System add-on implements some chat commands, the students can you in the FireStorm or Singularity viewers to ask or answer questions, teleport to landmarks or home and see active users and groups.

Chat command channels gives you access to the , if you type the command in the FireStorm or Singularity chat dialog. Square brackets [ ] mean the parameter is optional and | means an alternative.

Students are created as normal users (user level 0) and teachers are created as superusers (User level 100) and therefore have some additional commands.

Student chat commands Description
/9 languages Show list of available languages in currently loaded learning module
/9 use [code] Set preferred language as ISO 639-1 code: da=Danish, en=English, en-us=American English. This language code is stored in the server side Heads Up Display state on the simulator, if the region learning module creates a Heads Up Display in Region.Module.hud.iar that calls LSL script modalsCreateHUD. How this language preference and other HUD state is used is up to the developers of the region learnig module.
/9 questions List student questions
/9 ask [question] Student can ask for help regarding question
/9 answer firstname lastname [message] Student can answer other students questions
/9 delete Delete my first question, when I got the answer
/9 landmarks Show region landmarks
/9 teleport [home|landmark name] Teleport to my home location or region named landmark
/9 groups List names of all groups
/9 users List names of active users
/9 help [command|superuser] Show help for specific command or list superuser commands

Teachers or students acting as superusers, have some extra commands for testing a learning module that is to be translated into multiple languages. If you for example load the free EnglishGarden archive and want to extent it with some text and dialogs in multiple languages, then you would create a text csv file called EnglishGarden.dic.csv like below:

uuid;en-us;da-dk;Welcome to the garden;Velkommen til haven;What is your name?;Hvad er dit navn?;My name is {0};Mit navn er {0}

In the above example I have created a dictionary with text in American English and Danish, that I want to use in my learning module. A text can include a placeholder like {0},{1},.. for dynamic text to be inserted at run time. The first column header is a universally unique identifier (uuid), that will be used to reference the text in LSL script to implement virtual world actions.

Superusers can teleport to any location in a region, not just landmarks and home like students. If you in the Dashboard select a region, you will see a map with active students. If you click on the map markers you will get the students position in the virtual world, which you can copy and paste into your FireStorm or Singularity viewer to join the student in the virtual world.

Teacher chat commands Description
/9 default language [code] Set default language as ISO 639-1 language code, to a language that is implemented in a learning module dictionary file as a csv file column header. A dictionary file is for example named EnglishGarden.dic.csv and when loaded in a region it will be prefixed with the region name, for example Region1.EnglishGarden.dic.csv. Default dictionary language is American English (en-US).
/9 teleport X,Y,Z Teleport to location like 128,128,22
/9 loadcsv [dictionary] Load dictionary for modalsDictionary LSL script method with region language translations. Example /9 loadcsv Region1.EnglishGarden.dic.csv
/9 start log Turn chat and behavior logging on
/9 stop log Turn chat and behavior logging off
/9 log [json object] Log JSON object like {“debug”:”checkpoint charlie”}


LSL script extension for making learning modules

When implementing actions in a virtual world you will use the LSL script language. The Adaptive Learning System OpenSimulator add-on extends the LSL script language with methods that have a prefix of modals in their name.

Methods for reading texts from language translation dictionary file and replacing dynamic parts.

  modalsDictionary        Return translated text for id or translated id for sound
  modalsStringFormat      Replace string place holders {0},{1} and {2}

Methods for logging learning experience in xAPI JSON, with student rating or task links

  modalsLog               Log learning experiences 
  modalsLogRating         Log learning experiences with user rating of personal understanding
  modalsLogTask           Log learning experiences with external task reference
  modalsLogRatingTask     Log learning experiences with user rating and external task reference

Methods for building custom xAPI (TinCan) statements to log learning outcome


Methods for building learning space teleport to location boards, Heads Up Display state

  modalsCreateHUD         Create Heads Up Display (HUD) server side state in simulator
  modalsRemoveHUD         Remove Heads Up Display (HUD) server side state in simulator
  modalsGetKeyHUD         Get HUD key string values from server side state
  modalsSetKeyHUD         Set HUD key string values in server side state
  modalsSignalHUD         Signal action to HUD like refresh

Methods for logging any JSON or text


LSL script constants

  MODALS_LISTEN_CHANNEL   Adaptive learning module listen channel defined in AdaptiveLearningSystem.ini
                          Default value: listen_channel = 9
  MODALS_WEB_ROOT         Web root for Heads Up Display defined in AdaptiveLearningSystem.ini
                          Default value: web_root = ""

LSL script constants for xAPI (TinCan) constants. Previously all constants defined below were reserved verbs, but now only the voided verb is a reserved. See xAPI about

  Constant                            Verbs

  Constant                            Activities