IRegionModule/de

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
(Created page with "{{Quicklinks}} <br /> = Bitte beachten Sie = Diese Seite behandelt den Mechanismus des Bereichsmoduls, der seit OpenSimulator 0.6.9 vorhanden ist. Eine ältere Version die au...")
 
(In OpenSim.Region.Framework.Scenes.EventManager)
 
(8 intermediate revisions by one user not shown)
Line 76: Line 76:
 
  searchDirectory: addon-modules/BareBonesNonSharedModule
 
  searchDirectory: addon-modules/BareBonesNonSharedModule
  
or similar. Now, if you are using an IDE such as Visual Studio or MonoDevelop, you should now be able to reload the OpenSim.sln solution and see your project within the source tree.
+
o.ä. Wenn Sie jetzt eine IDE wie Visual Studio oder MonoDevelop verwenden, sollten Sie jetzt in der Lage sein, die OpenSim.sln-Lösung neu zu laden und Ihr Projekt in der Quellstruktur zu sehen.
  
If anything goes wrong, look carefully at the output for runprebuild.sh/.bat. You may see messages such as
+
Wenn etwas schief geht, schauen Sie sich die Ausgabe für runprebuild.sh/.bat genau an. Möglicherweise sehen Sie Nachrichten wie
  
 
  [!] Could not resolve Solution path: addon-modules/BareBonesNonSharedModule/src/BareBonesNonSharedModule
 
  [!] Could not resolve Solution path: addon-modules/BareBonesNonSharedModule/src/BareBonesNonSharedModule
  
which indicate that your prebuild.xml file for that module is not correctly picking up the source folder.
+
was darauf hinweist, dass Ihre prebuild.xml-Datei für dieses Modul den Quellordner nicht korrekt aufnimmt.
  
5.  Add or edit module files in your project as required.
+
5.  Fügen Sie nach Bedarf Moduldateien in Ihrem Projekt hinzu oder bearbeiten Sie sie.
  
6.  Re-run runprebuild.sh if you have added any new files to your module.
+
6.  Führen Sie runprebuild.sh erneut aus, wenn Sie Ihrem Modul neue Dateien hinzugefügt haben.
  
7.  Build OpenSim.sln using your usual build method, whether that's within the IDE or on the command line with xbuild (mono) or nant.
+
7.  Erstellen Sie OpenSim.sln mit Ihrer üblichen Build-Methode, egal ob Sie innerhalb der IDE oder in der Befehlszeile mit xbuild (mono) oder nant arbeiten.
  
8.  If compilation succeeds, the build process will copy the binary into the OpenSimulator bin/ directory. When you next restart OpenSimulator, it should be loaded into the simulator and appear in the output for the "show modules" console command.
+
8.  Wenn die Kompilierung erfolgreich ist, kopiert der Buildprozess die Binärdatei in das OpenSimulator-Verzeichnis bin /. Wenn Sie OpenSimulator das nächste Mal starten, sollte es in den Simulator geladen werden und in der Ausgabe für den Konsolenbefehl "show modules" erscheinen.
  
== From existing module code ==
+
== Aus bestehendem Modul-Code ==
If you are looking to build a region module that already exists, the steps are a little simpler.
+
Wenn Sie ein Regionsmodul erstellen möchten, das bereits existiert, sind die Schritte etwas einfacher.
  
1.  Place the module code inside the base OpenSimulator addon-modules directory. For example, if you are looking to compile a module called EventRecorderModule, then this will be situated at addon-modules/EventRecorderModule. Please be aware that the name of the module must match the patch in the prebuild.xml file (in this example, the file is EventRecorderModule/prebuild.xml).
+
1.  Platzieren Sie den Modulcode im OpenSimulator-Addonmodul-Basisverzeichnis. Wenn Sie z. B. ein Modul namens EventRecorderModule kompilieren möchten, befindet es sich unter addon-modules / EventRecorderModule. Bitte beachten Sie, dass der Name des Moduls mit dem Patch in der Datei prebuild.xml übereinstimmen muss (in diesem Beispiel ist die Datei EventRecorderModule / prebuild.xml).
  
2.  As above, re-run prebuild.sh/prebuild.bat. This is to insert the module into the OpenSimulator build solution (OpenSim.sln).
+
2.  Führen Sie wie oben prebuild.sh/prebuild.bat erneut aus. Dies ist das Einfügen des Moduls in die OpenSimulator-Build-Lösung (OpenSim.sln).
  
3.  You can now compile the module with Visual Studio, MonoDeveloper, xbuild or nant.
+
3.  Sie können das Modul jetzt mit Visual Studio, MonoDeveloper, xbuild oder nant kompilieren.
  
4.  On the next startup of OpenSimulator, the module should be loaded (the prebuild.xml places the built module within OpenSimulator's bin/).
+
4.  Beim nächsten Start von OpenSimulator sollte das Modul geladen werden (die Datei prebuild.xml platziert das eingebaute Modul in das Bin / des OpenSimulator).
  
=Installing Region Modules=
+
=Installieren von Regionsmodulen=
If you are just installing an existing region module DLL rather than building it from source then you will need to
+
Wenn Sie nur eine vorhandene Region-Modul-DLL installieren, anstatt sie aus der Quelle zu erstellen, müssen Sie dies tun
  
1.  Copy the DLL and any other associated files into $OPENSIM_BASE/bin
+
1.  Kopieren Sie die DLL und alle anderen zugehörigen Dateien in $ OPENSIM_BASE / bin
  
2.  In most cases configure the module, either by adding the required section to OpenSim.ini, adding it as bin/addon-modules/MyModule/config/config.ini or by [[Configuring_Simulator_Parameters|explicitly including the module's configuration file]].
+
2.  In den meisten Fällen konfigurieren Sie das Modul, indem Sie entweder den gewünschten Abschnitt zu OpenSim.ini hinzufügen, ihn als bin / addon-modules / MyModule / config / config.ini hinzufügen oder indem Sie [[Configuring_Simulator_Parameters|explizit die Konfigurationsdatei des Moduls]] hinzufügen.
  
=Region Module Interfaces=
+
=Region Modul Schnittstellen=
All region modules must implement INonSharedRegionModule or ISharedRegionModule from OpenSim.Region.Framework.Interfaces. If a region module implements INonSharedRegionModule then an instance of that module is created for each region (aka scene) in the simulator. Each module only knows about its own region. If a region module implements ISharedRegionModule then only a single instance of the module exists and it is informed about all regions/scenes in the simulators.
+
Alle Regionsmodule müssen INonSharedRegionModule oder ISharedRegionModule von OpenSim.Region.Framework.Interfaces implementieren. Wenn ein Regionsmodul INonSharedRegionModule implementiert, wird eine Instanz dieses Moduls für jede Region (aka Szene) im Simulator erstellt. Jedes Modul kennt nur seine eigene Region. Wenn ein Regionsmodul ISharedRegionModule implementiert, existiert nur eine einzige Instanz des Moduls und es wird über alle Regionen / Szenen in den Simulatoren informiert.
  
Both INonSharedRegionModule and ISharedRegionModule extend IRegionModuleBase which implements the bulk of the interface methods. These are as follows.
+
Sowohl INonSharedRegionModule als auch ISharedRegionModule erweitern IRegionModuleBase, das den Großteil der Schnittstellenmethoden implementiert. Diese sind wie folgt.
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 135: Line 135:
 
<tr>
 
<tr>
 
   <td>Name</td>
 
   <td>Name</td>
   <td>This name is shown when the console command "show modules" is run. For example, "Sim Chat Module" or "The Best Region Module Ever".</td>
+
   <td>Dieser Name wird angezeigt, wenn der Konsolenbefehl "show modules" ausgeführt wird. Zum Beispiel "Sim Chat Modul" oder "Das beste Regionsmodul überhaupt".</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
   <td>ReplaceableInterface</td>
 
   <td>ReplaceableInterface</td>
   <td>If this is not null, then the module is not loaded if any other module implements the given interface. One use for this is to provide 'stub' functionality implementations that are only active if no other module is present</td>
+
   <td>Wenn dies nicht null ist, wird das Modul nicht geladen, wenn ein anderes Modul die angegebene Schnittstelle implementiert. Eine Verwendung hierfür ist das Bereitstellen von "Stub" -Funktionalitätsimplementierungen, die nur dann aktiv sind, wenn kein anderes Modul vorhanden ist</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
   <td>Initialise</td>
 
   <td>Initialise</td>
   <td>This method is called immediately after the region module has been loaded into the runtime, before it has been added to a scene or scenes. IConfigSource is a [http://nini.sourceforge.net/ Nini] class that contains the concatentation of config parameters from OpenSim.ini, OpenSimDefaults.ini and the appropriate ini files in bin/config-include</td>
+
   <td>Diese Methode wird unmittelbar nach dem Laden des Bereichsmoduls in die Laufzeit aufgerufen, bevor sie einer Szene oder Szenen hinzugefügt wurde. IConfigSource ist eine Nini- Klasse, die die Konkatentation von Konfigurationsparametern aus OpenSim.ini, OpenSimDefaults.ini und den entsprechenden Ini-Dateien in bin / config-include enthält</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
   <td>AddRegion</td>
 
   <td>AddRegion</td>
   <td>This method is called when a region is added to the module. For shared modules this will happen multiple times (one for each module). For non-shared modules this will happen only once. The module can store the scene reference and use it later to reach and invoke OpenSimulator internals and interfaces.</td>
+
   <td>Diese Methode wird aufgerufen, wenn dem Modul eine Region hinzugefügt wird. Für gemeinsam genutzte Module wird dies mehrere Male passieren (eine für jedes Modul). Bei nicht geteilten Modulen wird dies nur einmal vorkommen. Das Modul kann die Szenenreferenz speichern und später verwenden, um OpenSimulator-Interna und -Schnittstellen zu erreichen und aufzurufen.</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
   <td>RemoveRegion</td>
 
   <td>RemoveRegion</td>
   <td>Called when a region is removed from a module. For shared modules this can happen multiple times. For non-shared region modules this will happen only once and should shortly be followed by a Close(). On simulator shutdown, this method will be called before Close(). RemoveRegion() can also be called if a region/scene is manually removed while the simulator is running.</td>
+
   <td>Wird aufgerufen, wenn eine Region aus einem Modul entfernt wird. Bei gemeinsam genutzten Modulen kann dies mehrfach vorkommen. Bei Modulen, die nicht gemeinsam genutzt werden, geschieht dies nur einmal und sollte in Kürze von Close () gefolgt werden. Beim Herunterfahren des Simulators wird diese Methode vor Close () aufgerufen. RemoveRegion () kann auch aufgerufen werden, wenn eine Region / Szene manuell entfernt wird, während der Simulator ausgeführt wird.</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
   <td>RegionLoaded</td>
 
   <td>RegionLoaded</td>
   <td>Called when all modules have been added for a particular scene/region. Since all other modules are now loaded, this gives the module an opportunity to obtain interfaces or subscribe to events on other modules. Called once for a non-shared region module and multiple times for shared region modules.</td>
+
   <td>Wird aufgerufen, wenn alle Module für eine bestimmte Szene / Region hinzugefügt wurden. Da nun alle anderen Module geladen sind, hat das Modul die Möglichkeit, Schnittstellen zu erhalten oder Ereignisse auf anderen Modulen zu abonnieren. Wird einmal für ein nicht gemeinsam genutztes Regionsmodul und mehrere Male für gemeinsam genutzte Regionsmodule aufgerufen.</td>
 
<tr>
 
<tr>
 
   <td>Close</td>
 
   <td>Close</td>
 
   <td>
 
   <td>
* For a non-shared region module, this will be called when its region is closed. This usually occurs on shutdown. However, it's also possible for a region to be removed whilst the simulator remains running.
+
* Bei einem nicht geteilten Regionsmodul wird dieses aufgerufen, wenn seine Region geschlossen ist. Dies tritt normalerweise beim Herunterfahren auf. Es ist jedoch auch möglich, dass eine Region entfernt wird, während der Simulator läuft.
* For a shared region module, this should be called when the simulator is shutdown. '''However, due to a regression in OpenSimulator 0.8 (and probably in many earlier versions) this was not occurring. This is fixed in current development code (from commit 889194d, 3rd July 2014). In the mean time, the easiest workaround is to count the number of scenes added to the module and then shutdown if the same number are removed. However, this will stop it being possible to operate a simulator with temporarily no regions (a somewhat minor use case). For an example of this approach, see https://github.com/justincc/EventRecordingModule/blob/master/src/EventRecorder/EventRecordingModule.cs'''
+
* ür ein Shared-Region-Modul sollte dies aufgerufen werden, wenn der Simulator heruntergefahren wird. Aufgrund einer Regression in OpenSimulator 0.8 (und wahrscheinlich in vielen früheren Versionen) trat dies jedoch nicht auf. Dies ist im aktuellen Entwicklungscode festgelegt (ab Commit 889194d, 3. Juli 2014). In der Zwischenzeit besteht die einfachste Problemumgehung darin, die Anzahl der dem Modul hinzugefügten Szenen zu zählen und dann herunterzufahren, wenn die gleiche Anzahl entfernt wird. Dies wird jedoch verhindern, dass ein Simulator mit vorübergehend keinen Regionen betrieben werden kann (ein etwas kleinerer Anwendungsfall). Ein Beispiel für diesen Ansatz finden Sie unter https://github.com/justincc/EventRecordingModule/blob/master/src/EventRecorder/EventRecordingModule.cs'''
 
</tr>
 
</tr>
 
</table>
 
</table>
  
INonSharedRegionModule itself contains no methods, being defined simply as
+
INonSharedRegionModule selbst enthält keine Methoden, einfach definiert als
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 172: Line 172:
 
</source>
 
</source>
  
ISharedRegionModule has one additional method.
+
ISharedRegionModule verfügt über eine zusätzliche Methode.
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 188: Line 188:
 
<tr>
 
<tr>
 
   <td>PostInitialise</td>
 
   <td>PostInitialise</td>
   <td>Guaranteed to be called after Initialise() on all other modules has been called but before modules are added.</td>
+
   <td>Garantiert, nachdem Initialise () für alle anderen Module aufgerufen wurde, aber bevor Module hinzugefügt werden.</td>
 
</tr>
 
</tr>
 
</table>
 
</table>
  
= Example Region Module =
+
= Beispiel Region Modul =
  
This example assumes that you are using the file already in the OpenSimulator source tree (from 0.7.1 onwards) at OpenSim/Region/OptionalModules/Example/BareBonesNonShared/BareBonesNonSharedModule.cs. There's also a bare bones shared module example there. To build this as a separate project, please see the instructions above.
+
In diesem Beispiel wird davon ausgegangen, dass Sie die Datei verwenden, die sich bereits in der OpenSimulator-Quellstruktur (ab 0.7.1) unter OpenSim / Region / OptionalModules / Example / BareBonesNonShared / BareBonesNonSharedModule.cs befindet. Es gibt dort auch ein Beispiel für ein Shared-Modul. Um dies als separates Projekt zu erstellen, beachten Sie bitte die obigen Anweisungen.
  
BareBonesNonShareadModule is very basic. It does nothing more than log calls made to IRegionModule methods in the process of activating the module.
+
BareBonesNonShreadModule ist sehr einfach. Es führt lediglich Aufrufe von IRegionModule-Methoden in den Prozess der Aktivierung des Moduls aus.
  
In the source tree, the [Extension... attribute line is commented. You can uncomment this, rebuild OpenSimulator and start it to see the module in action.
+
In der Quellstruktur ist die Attributzeile [Erweiterung ...] kommentiert. Sie können dies auskommentieren, OpenSimulator neu erstellen und starten, um das Modul in Aktion zu sehen.  
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 261: Line 261:
 
</source>
 
</source>
  
== Enabling the module ==
+
== Aktivieren des Moduls ==
  
Creating the module code itself isn't quite enough to enable it. To do that, we need to make it visible to OpenSimulator's module mechanism (which is currently [http://www.mono-project.com/Mono.Addins Mono.Addins]).
+
Das Erstellen des Modulcodes selbst reicht nicht aus, um es zu aktivieren. Um dies zu tun, müssen wir es für den [http://www.mono-project.com/Mono.Addins Mono.Addins]).
  
This is done by adding an Extension attribute to the class, for example.
+
Dies geschieht beispielsweise, indem der Klasse ein Extension-Attribut hinzugefügt wird.
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 271: Line 271:
 
</source>
 
</source>
  
The important part here is the "Path" section "/OpenSim/RegionModules" - this is how OpenSimulator retrieves modules from Mono.Addins. The Id can be anything meaningful to the module.
+
Der wichtige Teil hier ist der "Pfad" Abschnitt "/ OpenSim / RegionModules" - so ruft OpenSimulator Module von Mono.Addins ab. Die ID kann für das Modul sinnvoll sein.
  
Newer Mono versions also need this kind of section before the namespace declaration:
+
Neuere Mono-Versionen benötigen diese Art von Abschnitt auch vor der Namespace-Deklaration:  
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 280: Line 280:
 
</source>
 
</source>
  
At the beginning of your module source code file you need to add this line:
+
Zu Beginn der Modulquellcodedatei müssen Sie diese Zeile hinzufügen:
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 286: Line 286:
 
</source>
 
</source>
  
And prebuild.xml needs to include such a line for newer Mono versions:
+
Und prebuild.xml muss eine solche Zeile für neuere Mono-Versionen enthalten:
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 292: Line 292:
 
</source>
 
</source>
  
= Integrating with OpenSimulator =
+
= Integration mit OpenSimulator =
  
NOTE: This section is very incomplete and parts are out of date. If you need to know something, please ask on the OpenSimulator [[mailing lists]] where we can both answer the question and add the necessary documentation here.
+
HINWEIS: Dieser Abschnitt ist sehr unvollständig und Teile sind veraltet. Wenn Sie etwas wissen müssen, fragen Sie bitte in den Mailinglisten von OpenSimulator, wo wir beide die Frage beantworten und die notwendige Dokumentation hier hinzufügen können.
  
However, please note that OpenSimulator is a very young project and the internal interfaces can change at short notice. If this happens, it is up to you to keep your module up to date with later versions of OpenSimulator.
+
Beachten Sie jedoch, dass OpenSimulator ein sehr junges Projekt ist und die internen Schnittstellen sich kurzfristig ändern können. In diesem Fall liegt es an Ihnen, Ihr Modul mit späteren Versionen von OpenSimulator auf dem neuesten Stand zu halten.  
  
== Accessible Objects ==
+
== Zugängliche Objekte ==
  
In the '''AddRegion''' 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.
+
In der AddRegion- Routine erhalten Sie Zugriff auf das Szenenobjekt für die Region, von hier aus können Sie in die Szene spinnen und Zugang zu vielen anderen interessanten Objekten erhalten.
  
* 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).
+
* scene.GetEntities() - gibt eine Liste aller Entitäten in der Umgebung zurück. Dies wird eine kombinierte Liste von SceneObjectGroups (Prim Sets) und ScenePresences (Avatars) sein.
* scene.GetAvatars() - get only the avatars in the scene (very handy for sending messages to clients)
+
* scene.GetAvatars() - ruft nur die Avatare in der Szene ab (sehr praktisch zum Senden von Nachrichten an Clients)
* scene.EventManager - this is the object from which you can register callbacks for scene events. Some examples provided below.
+
* scene.EventManager - Dies ist das Objekt, von dem aus Sie Callbacks für Szenenereignisse registrieren können. Einige Beispiele finden Sie unten.
* scene.RegionInfo - properties about the region
+
* scene.RegionInfo - Eigenschaften der Region
  
== Events ==
+
== Veranstaltungen ==
  
Various occurrences in OpenSimulator (e.g. avatar entering a region, chat) have event hooks to which a module can subscribe. The major sets of events are available from Scene.EventManager.
+
Verschiedene Ereignisse im OpenSimulator (z. B. Avatare, die eine Region betreten, Chat) haben Ereignis-Hooks, die ein Modul abonnieren kann. Die wichtigsten Ereignisse sind in Scene.EventManager verfügbar.
  
In many cases, you want to do as little work as possible in the thread that fires the event as many coming from time-critical areas in the OpenSimulator code (e.g. within main scene frame processing) or areas where a holdup will cause other disruption (e.g. events which notify that a root agent has arrived).
+
In vielen Fällen möchten Sie in dem Thread, der das Ereignis auslöst, so wenig Arbeit wie möglich leisten, da viele aus zeitkritischen Bereichen im OpenSimulator-Code kommen (z. B. innerhalb der Hauptszenerahmenverarbeitung) oder Bereiche, in denen ein Überfall andere Störungen verursacht ( zB Ereignisse, die melden, dass ein Root-Agent angekommen ist).
  
These events are somewhat rough and ready because they were originally created for internal OpenSimulator use and by default modules started to use them. Thus, there is inconsistency with names, arguments and the events exposed. Please be prepared for all of these to change over time or be superseded by more appropriate events.
+
Diese Ereignisse sind etwas grob und bereit, da sie ursprünglich für die interne Verwendung von OpenSimulator erstellt wurden und standardmäßig Module gestartet wurden, um sie zu verwenden. Daher gibt es eine Inkonsistenz mit Namen, Argumenten und den offengelegten Ereignissen. Seien Sie bitte darauf vorbereitet, dass sich all dies im Laufe der Zeit ändert oder durch angemessenere Ereignisse ersetzt wird.  
  
=== Registering for events ===
+
=== Registrierung für Veranstaltungen ===
  
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:
+
Am Beispiel des [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs?view=markup SunModule] können wir den folgenden Code sehen:
  
 
In Initialise():
 
In Initialise():
Line 325: Line 325:
 
...
 
...
 
</source>
 
</source>
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. So in this particular case, you want to be very careful about the actions you perform in this event as they will have a direct impact on scene loop performance (where taking a long time will result in symptoms of lag for moving avatars, etc.).  
+
Ganz einfach, wir haben gerade den EventManager bekommen und die SunUpdate Methode als Callback für das OnFrame Event registriert. OnFrame wird jedes Mal ausgelöst, wenn es in Opensim einen Renderrahmen gibt, der ungefähr 20 Mal pro Sekunde ist. In diesem Fall solltest du also sehr vorsichtig mit den Aktionen sein, die du in diesem Event machst, da sie sich direkt auf die Performance des Szenen-Loops auswirken (lange Wartezeiten führen zu Lag-Symptomen für bewegte Avatare usw.) .
  
Here's the function itself
+
Hier ist die Funktion selbst
  
 
<source lang="csharp">
 
<source lang="csharp">
Line 352: Line 352:
 
</source>
 
</source>
  
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.
+
SunUpdate () nimmt keinen Parameter (einige Ereignisse erfordern sie möglicherweise). Es wird standardmäßig nur jedes 1000. Frame ausgelöst (m_frame_mod = 1000 in diesem Modul), so dass es nicht zu viele Zyklen dauert.
  
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. Moreover, you only want to do this for root agents (agents that actually have an attached avatar that can move around, etc.). Updates sent to child agents (which allow viewers to see into neighbouring regions) will simply be ignored.
+
Damit sich die Sonnenposition für die Kunden ändert, muss ihnen gesagt werden, dass sie sich ändert. Dies geschieht, indem Sie eine Liste aller Avatare aus der Szene holen und dann die Sonnenposition nacheinander an sie senden. Darüber hinaus möchten Sie dies nur für Root-Agenten tun (Agenten, die tatsächlich einen angehängten Avatar haben, der sich bewegen kann, usw.). Updates, die an untergeordnete Agenten gesendet werden (die es Zuschauern ermöglichen, in benachbarte Regionen zu sehen), werden einfach ignoriert.  
  
=== Available Events ===
+
=== Verfügbare Ereignisse ===
Here is an extremely incomplete list of available events (which hopefully should be filled out as time goes by). For more details, please see the OpenSimulator code itself. Please also note that OpenSimulator is still in development. Event parameters and names may change over time.
+
Hier ist eine extrem unvollständige Liste der verfügbaren Ereignisse (die hoffentlich im Laufe der Zeit ausgefüllt werden sollte). Weitere Details finden Sie im OpenSimulator-Code selbst. Bitte beachten Sie auch, dass OpenSimulator noch in Entwicklung ist. Event-Parameter und Namen können sich im Laufe der Zeit ändern.
  
In the table below, the delay columns signal whether a delay in processing the event is likely to disrupt the simulator as a whole and/or the entity (e.g. a user) in question. However, please be aware that even if there is no immediate disruption from delaying one event thread, delaying many will eventually cause simulator wide problems as the threadpool is exhausted.
+
In der nachstehenden Tabelle signalisieren die Verzögerungsspalten, ob eine Verzögerung bei der Verarbeitung des Ereignisses wahrscheinlich den Simulator als Ganzes und / oder die betreffende Entität (z. B. einen Benutzer) stören wird. Beachten Sie jedoch, dass selbst wenn es keine sofortige Unterbrechung durch das Verzögern eines Ereignis-Threads gibt, das Verzögern von vielen zu Simulator-weiten Problemen führen wird, da der Threadpool erschöpft ist.  
  
 
==== In OpenSim.Region.Framework.Scenes.EventManager ====
 
==== In OpenSim.Region.Framework.Scenes.EventManager ====
Line 365: Line 365:
 
! Event name !! Parameters !! Delay can disrupt simulator !! Delay can disrupt user !! Description
 
! Event name !! Parameters !! Delay can disrupt simulator !! Delay can disrupt user !! Description
 
|-
 
|-
| OnClientLogin || IClientAPI client || No || Yes || Triggered on the region entered by a client when it first logs in. A delay in processing this event will hold up the entrance of the avatar to the scene.
+
| OnClientLogin || IClientAPI client || No || Yes || Wird in der Region ausgelöst, die von einem Client bei der ersten Anmeldung eingegeben wird. Eine Verzögerung bei der Verarbeitung dieses Ereignisses hält den Eintritt des Avatars in die Szene aufrecht.
 
|-
 
|-
| OnSetRootAgentScene || UUID agentID, Scene scene || No || Yes || Triggered when an avatar enters a scene and before any setup work has been done (such as initializing of attachments, etc.). A delay in processing this event will hold up the entrance of the avatar to the scene, which may be a particular issue with region crossings.
+
| OnSetRootAgentScene || UUID agentID, Scene scene || No || Yes || Wird ausgelöst, wenn ein Avatar eine Szene betritt und bevor irgendwelche Einrichtungsarbeiten ausgeführt wurden (z. B. Initialisierung von Anlagen usw.). Eine Verzögerung bei der Verarbeitung dieses Ereignisses wird den Eintritt des Avatars in die Szene aufhalten, was ein besonderes Problem bei Regionsüberquerungen sein kann.
 
|-
 
|-
| OnMakeRootAgent || ScenePresence presence || No || Yes || Triggered when an avatar enters a scene and after setup work has been done (recreation of attachment data, etc.). A delay in processing this event will hold up the entrance of the avatar to the scene, which may be a particular issue with region crossings. One can inspect the ScenePresence.TeleportFlags to determine if this is the initial login region for the viewer (ViaLogin) or whether their avatar is entering it in an existing session.
+
| OnMakeRootAgent || ScenePresence presence || No || Yes || Wird ausgelöst, wenn ein Avatar eine Szene betritt und nachdem die Einrichtungsarbeiten ausgeführt wurden (Wiederherstellung von Anlagendaten usw.). Eine Verzögerung bei der Verarbeitung dieses Ereignisses wird den Eintritt des Avatars in die Szene aufhalten, was ein besonderes Problem bei Regionsüberquerungen sein kann. Sie können ScenePresence.TeleportFlags anzeigen, um festzustellen, ob dies der anfängliche Anmeldebereich für den Viewer (ViaLogin) ist oder ob der Avatar diesen in einer vorhandenen Sitzung eingibt.
 
|-
 
|-
| OnMakeChildAgent || ScenePresence presence || No || Yes || Triggered when an avatar is converted from a root agent to a child agent. This happens when an avatar moves away from a scene, either by teleporting or region cross. It is not fired when an avatar directly logs out. A delay in processing this event should not cause too much disruption to the avatar moving away, though a long delay may prevent them from successfully re-entering the scene.
+
| OnMakeChildAgent || ScenePresence presence || No || Yes || Wird ausgelöst, wenn ein Avatar von einem Stammagenten in einen Kindagenten konvertiert wird. Dies geschieht, wenn sich ein Avatar von einer Szene wegbewegt, entweder durch Teleportieren oder Regions-Cross. Es wird nicht ausgelöst, wenn ein Avatar sich direkt abmeldet. Eine Verzögerung bei der Verarbeitung dieses Ereignisses sollte keine zu große Unterbrechung für den Avatar verursachen, der sich wegbewegt, obwohl eine lange Verzögerung sie daran hindern kann, erneut in die Szene einzutreten.
 
|-
 
|-
| OnClientClosed || UUID agentID, Scene scene || No || Yes || Triggered when a client is closed. This can be due to either a child agent no longer being needed or the user directly logging out from that region. If you want to distinguish between these two events, you will need to check the ScenePresence.IsChildAgent property. At this point, the agent will still be complete (e.g. it will have attachments registered to it) and it will be present in the scene graph. A delay in processing this event may cause issues if the user attempts to re-enter the simulator before the delay is complete.
+
| OnClientClosed || UUID agentID, Scene scene || No || Yes || Wird ausgelöst, wenn ein Client geschlossen wird. Dies kann entweder daran liegen, dass ein untergeordneter Agent nicht mehr benötigt wird oder sich der Benutzer direkt aus dieser Region abmeldet. Wenn Sie zwischen diesen beiden Ereignissen unterscheiden möchten, müssen Sie die ScenePresence.IsChildAgent-Eigenschaft überprüfen. Zu diesem Zeitpunkt ist der Agent noch vollständig (z. B. sind Anhänge für ihn registriert) und er wird im Szenegraph angezeigt. Eine Verzögerung bei der Verarbeitung dieses Ereignisses kann Probleme verursachen, wenn der Benutzer versucht, den Simulator erneut zu betreten, bevor die Verzögerung abgeschlossen ist.
 
|}
 
|}
  
 
= Where to go from here =
 
= Where to go from here =
  
* [[Getting Started with Region Modules]] -- the Hello World of OpenSimulator application development. Rather old by now but still worth a look.
+
* [[Getting Started with Region Modules]] -- die Hello World of OpenSimulator-Anwendungsentwicklung. Eher alt, aber immer noch einen Blick wert.
* http://bluewallvirtual.com/example_region_module - More shared region module example code by Bluewall.
+
* http://bluewallvirtual.com/example_region_module - Ein Beispielcode für einen gemeinsam genutzten Regionsmodul von Bluewall.
 
* [[New Region Modules|Development discussion of the current region module mechanism]]
 
* [[New Region Modules|Development discussion of the current region module mechanism]]
* Read the source for existing opensim core modules. These are in the OpenSim.Region.CoreModules and OpenSim.Region.OptionalModules projects. Looking through this code is an extremely good way to find out what region modules can do and how they can do it.
+
* Lesen Sie die Quelle für vorhandene openSIM-Kernmodule. Diese befinden sich in den Projekten OpenSim.Region.CoreModules und OpenSim.Region.OptionalModules. Durch diesen Code zu schauen, ist eine sehr gute Möglichkeit, herauszufinden, welche Region Module können und wie sie es tun können.
* Read the source code for the EventManager class in the OpenSim.Region.Framework.Scenes project. These list the many events that exist. Some modules may also export their own events (e.g. OnInventoryArchiveSaved in the InventoryArchiverModule at OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/).
+
* Lesen Sie den Quellcode für die EventManager-Klasse im OpenSim.Region.Framework.Scenes-Projekt. Diese listen die vielen vorhandenen Ereignisse auf. Einige Module können auch eigene Ereignisse exportieren (zB OnInventoryArchiveSaved im InventoryArchiverModule unter OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/).
* Help write some examples here. OpenSimulator grows with your contributions.
+
* Helfen Sie hier, einige Beispiele zu schreiben. OpenSimulator wächst mit Ihren Beiträgen.
  
 
[[Category:Development]]
 
[[Category:Development]]
 
[[Category:Modules]]
 
[[Category:Modules]]
 
[[Category:German Translations]]
 
[[Category:German Translations]]

Latest revision as of 13:52, 16 July 2018


Contents

[edit] Bitte beachten Sie

Diese Seite behandelt den Mechanismus des Bereichsmoduls, der seit OpenSimulator 0.6.9 vorhanden ist. Eine ältere Version die auf die älteren IRegionModule-Mechanismen verweist, finden Sie unter http://opensimulator.org/index.php?title=IRegionModule&oldid=13166

Siehe Related Software für Links zu vorhandenen Regionsmodulen.

[edit] Einführung

Region-Module sind Klassen, die die Schnittstellen INonSharedRegionModule oder ISharedRegionModule von OpenSimulator implementieren. .NET-DLLs, die diese Klassen enthalten, können dann in das Binärverzeichnis von OpenSimulator (bin /) gestellt werden. Beim Start durchsucht OpenSimulator dieses Verzeichnis und lädt dort alle darin enthaltenen Module.

Regionsmodule werden im Herzen des Simulators ausgeführt und haben Zugang zu allen Einrichtungen. Dies macht sie sehr leistungsfähig, bedeutet aber auch, dass bei der Erstellung besonders darauf geachtet werden muss, dass sie sich nicht negativ auf die Simulatorleistung auswirken.

Typischerweise registrieren Regionenmodule Methoden mit dem Ereignismanager des Simulators, die aufgerufen werden, wenn verschiedene Ereignisse auftreten (z. B. Avatar-Chat, Benutzer, der eine Region betritt usw.).

Es gibt zwei Arten von Regions-Modulen.

  • Nicht freigegebene Module, für die ein separates Modul für jede Region/Szene erstellt wird
  • Freigegebene Module, bei denen ein einzelnes Modul zwischen allen Regionen/Szenen geteilt wird, die auf demselben Simulator ausgeführt werden.

[edit] Erstellung eines Region Modules

[edit] Von Grund auf neu

Zu diesem Zeitpunkt werden Regionsmodule normalerweise in der OpenSimulator-Quellstruktur selbst mithilfe ihrer Build-Mechanismen erstellt.

Die Schritte sind wie folgt:

1. Navigieren Sie zu dem Verzeichnis addon-modules / in der Basis der OpenSimulator-Quellstruktur (nicht zu dem Verzeichnis bin / addon-modules / in der Bin-Baumstruktur, über das wir in Kürze sprechen werden).

2. Erstellen Sie ein Verzeichnis für das Regionsmodulprojekt, normalerweise mit demselben Namen wie das Regionsmodul. Zum Beispiel BareBonesNonSharedModule /

3. Erstellen Sie eine prebuild.xml für das Projekt. Dies ist die Datei, die von ./runprebuild.sh oder ./runprebuild.bat im Basis-OpenSimulator-Verzeichnis verwendet wird, um die entsprechenden Build-Dateien für Visual Studio, Monodevelop und nant zu erstellen. Für ein sehr einfaches Modul hätten Sie etwas wie

<Project frameworkVersion="v4_0" name="BareBonesNonSharedModule" path="addon-modules/BareBonesNonSharedModule/src/BareBonesNonSharedModule" type="Library">
  <Configuration name="Debug">
    <Options>
      <OutputPath>../../../../bin</OutputPath>
    </Options>
  </Configuration>
  <Configuration name="Release">
    <Options>
      <OutputPath>../../../../bin</OutputPath>
    </Options>
  </Configuration>
 
  <ReferencePath>../../../../bin</ReferencePath>
  <Reference name="System"/>
  <Reference name="log4net"/>
  <Reference name="Mono.Addins"/>
  <Reference name="Nini"/>
  <Reference name="OpenMetaverse"/>
  <Reference name="OpenMetaverseTypes"/>
  <Reference name="OpenSim.Framework"/>
  <Reference name="OpenSim.Region.Framework"/>
  <Reference name="OpenSim.Services.Interfaces"/>
 
  <Files>
    <Match pattern="*.cs" recurse="true"/>
    <Match path="Resources" pattern="*.*" buildAction="EmbeddedResource"/>
  </Files>
</Project>

Zu dieser Datei müssen einige Dinge beachtet werden

  • In OpenSimulator 0.8, wenn Sie auf Windows aufbauen, müssen Sie eine FrameworkVersion von 4_0 anstelle von 3_5 im oberen <Project> -Tag verwenden. Vor OpenSimulator 0.8 muss dies jedoch net 3_5 sein, damit der Build fortgesetzt werden kann. Bei Mono kann dies entweder 3_5 oder 4_0 auf OpenSimulator 0.8 sein, muss aber 4_0 sein, wenn Sie C# 4.0-Funktionen verwenden möchten.
  • Das Pfadattribut in <Projekt> muss auf den Speicherort im Verzeichnis addon-modules verweisen, in dem sich der Quellcode befindet. Dieses Verzeichnis ist relativ zum OpenSimulator-Stammpfad. Im obigen Beispiel befindet sich der Code in addon-modules / BareBonesNonSharedModule / src / BareBonesNonSharedModule.
  • Die <OutputPath> -Tags geben an, wo Ihre kompilierte Modul-DLL kopiert wird, nachdem sie erstellt wurde. Dies ist relativ zum Speicherort Ihres Quellcodes, wie im Pfadattribut von <Project> angegeben. In den meisten Fällen möchten Sie, dass dies zusammen mit dem Rest der DLLs im OpenSimulator-Verzeichnis / bin abgelegt wird. Legen Sie diese Datei nicht in das Verzeichnis bin / addon-modules - dies ist verwirrend nur für Addon-Modul-Konfigurationsdateien (* .ini).
  • Der <ReferencePath> -Wert gibt an, wo das Modulprojekt die DLLs finden kann, auf die es verweisen muss (OpenSimulator.Framework.dll, log4net.dll usw.).
  • Jede Bibliothek, auf die Sie in Ihren Modulen verweisen, benötigt ein <Referenz> -Tag. Das obige Beispiel listet Bibliotheken wie OpenSim.Framework.dll und OpenMetaverse auf.
  • Weitere Beispiele finden Sie in der Hauptdatei prebuild.xml im Stammverzeichnis der OpenSimulator-Quellstruktur. Bitte beachten Sie, dass das obige Beispiel im Vergleich zu vielen anderen Einträgen optimiert ist - die Hauptdatei muss zu einem gewissen Zeitpunkt vereinfacht werden, da es eine große Redundanz gibt (zB muss Pfad nicht in jedem <Reference> angegeben werden) bereits durch <ReferencePath> angegeben).

4. Navigieren Sie zurück zum OpenSimulator-Stammverzeichnis und führen Sie ./runprebuild.sh (Linux, Mac OSX) oder ./runprebuild.bat (Windows) aus. In der resultierenden Ausgabe, in der Nähe der Spitze, sollten Sie die Linie sehen

searchDirectory: addon-modules/BareBonesNonSharedModule

o.ä. Wenn Sie jetzt eine IDE wie Visual Studio oder MonoDevelop verwenden, sollten Sie jetzt in der Lage sein, die OpenSim.sln-Lösung neu zu laden und Ihr Projekt in der Quellstruktur zu sehen.

Wenn etwas schief geht, schauen Sie sich die Ausgabe für runprebuild.sh/.bat genau an. Möglicherweise sehen Sie Nachrichten wie

[!] Could not resolve Solution path: addon-modules/BareBonesNonSharedModule/src/BareBonesNonSharedModule

was darauf hinweist, dass Ihre prebuild.xml-Datei für dieses Modul den Quellordner nicht korrekt aufnimmt.

5. Fügen Sie nach Bedarf Moduldateien in Ihrem Projekt hinzu oder bearbeiten Sie sie.

6. Führen Sie runprebuild.sh erneut aus, wenn Sie Ihrem Modul neue Dateien hinzugefügt haben.

7. Erstellen Sie OpenSim.sln mit Ihrer üblichen Build-Methode, egal ob Sie innerhalb der IDE oder in der Befehlszeile mit xbuild (mono) oder nant arbeiten.

8. Wenn die Kompilierung erfolgreich ist, kopiert der Buildprozess die Binärdatei in das OpenSimulator-Verzeichnis bin /. Wenn Sie OpenSimulator das nächste Mal starten, sollte es in den Simulator geladen werden und in der Ausgabe für den Konsolenbefehl "show modules" erscheinen.

[edit] Aus bestehendem Modul-Code

Wenn Sie ein Regionsmodul erstellen möchten, das bereits existiert, sind die Schritte etwas einfacher.

1. Platzieren Sie den Modulcode im OpenSimulator-Addonmodul-Basisverzeichnis. Wenn Sie z. B. ein Modul namens EventRecorderModule kompilieren möchten, befindet es sich unter addon-modules / EventRecorderModule. Bitte beachten Sie, dass der Name des Moduls mit dem Patch in der Datei prebuild.xml übereinstimmen muss (in diesem Beispiel ist die Datei EventRecorderModule / prebuild.xml).

2. Führen Sie wie oben prebuild.sh/prebuild.bat erneut aus. Dies ist das Einfügen des Moduls in die OpenSimulator-Build-Lösung (OpenSim.sln).

3. Sie können das Modul jetzt mit Visual Studio, MonoDeveloper, xbuild oder nant kompilieren.

4. Beim nächsten Start von OpenSimulator sollte das Modul geladen werden (die Datei prebuild.xml platziert das eingebaute Modul in das Bin / des OpenSimulator).

[edit] Installieren von Regionsmodulen

Wenn Sie nur eine vorhandene Region-Modul-DLL installieren, anstatt sie aus der Quelle zu erstellen, müssen Sie dies tun

1. Kopieren Sie die DLL und alle anderen zugehörigen Dateien in $ OPENSIM_BASE / bin

2. In den meisten Fällen konfigurieren Sie das Modul, indem Sie entweder den gewünschten Abschnitt zu OpenSim.ini hinzufügen, ihn als bin / addon-modules / MyModule / config / config.ini hinzufügen oder indem Sie explizit die Konfigurationsdatei des Moduls hinzufügen.

[edit] Region Modul Schnittstellen

Alle Regionsmodule müssen INonSharedRegionModule oder ISharedRegionModule von OpenSim.Region.Framework.Interfaces implementieren. Wenn ein Regionsmodul INonSharedRegionModule implementiert, wird eine Instanz dieses Moduls für jede Region (aka Szene) im Simulator erstellt. Jedes Modul kennt nur seine eigene Region. Wenn ein Regionsmodul ISharedRegionModule implementiert, existiert nur eine einzige Instanz des Moduls und es wird über alle Regionen / Szenen in den Simulatoren informiert.

Sowohl INonSharedRegionModule als auch ISharedRegionModule erweitern IRegionModuleBase, das den Großteil der Schnittstellenmethoden implementiert. Diese sind wie folgt.

public interface IRegionModuleBase
{
     string Name { get; }
     Type ReplaceableInterface { get; }
     void Initialise(IConfigSource source);
     void AddRegion(Scene scene);
     void RemoveRegion(Scene scene);
     void RegionLoaded(Scene scene);
     void Close();
}
Method Description
Name Dieser Name wird angezeigt, wenn der Konsolenbefehl "show modules" ausgeführt wird. Zum Beispiel "Sim Chat Modul" oder "Das beste Regionsmodul überhaupt".
ReplaceableInterface Wenn dies nicht null ist, wird das Modul nicht geladen, wenn ein anderes Modul die angegebene Schnittstelle implementiert. Eine Verwendung hierfür ist das Bereitstellen von "Stub" -Funktionalitätsimplementierungen, die nur dann aktiv sind, wenn kein anderes Modul vorhanden ist
Initialise Diese Methode wird unmittelbar nach dem Laden des Bereichsmoduls in die Laufzeit aufgerufen, bevor sie einer Szene oder Szenen hinzugefügt wurde. IConfigSource ist eine Nini- Klasse, die die Konkatentation von Konfigurationsparametern aus OpenSim.ini, OpenSimDefaults.ini und den entsprechenden Ini-Dateien in bin / config-include enthält
AddRegion Diese Methode wird aufgerufen, wenn dem Modul eine Region hinzugefügt wird. Für gemeinsam genutzte Module wird dies mehrere Male passieren (eine für jedes Modul). Bei nicht geteilten Modulen wird dies nur einmal vorkommen. Das Modul kann die Szenenreferenz speichern und später verwenden, um OpenSimulator-Interna und -Schnittstellen zu erreichen und aufzurufen.
RemoveRegion Wird aufgerufen, wenn eine Region aus einem Modul entfernt wird. Bei gemeinsam genutzten Modulen kann dies mehrfach vorkommen. Bei Modulen, die nicht gemeinsam genutzt werden, geschieht dies nur einmal und sollte in Kürze von Close () gefolgt werden. Beim Herunterfahren des Simulators wird diese Methode vor Close () aufgerufen. RemoveRegion () kann auch aufgerufen werden, wenn eine Region / Szene manuell entfernt wird, während der Simulator ausgeführt wird.
RegionLoaded Wird aufgerufen, wenn alle Module für eine bestimmte Szene / Region hinzugefügt wurden. Da nun alle anderen Module geladen sind, hat das Modul die Möglichkeit, Schnittstellen zu erhalten oder Ereignisse auf anderen Modulen zu abonnieren. Wird einmal für ein nicht gemeinsam genutztes Regionsmodul und mehrere Male für gemeinsam genutzte Regionsmodule aufgerufen.
Close
  • Bei einem nicht geteilten Regionsmodul wird dieses aufgerufen, wenn seine Region geschlossen ist. Dies tritt normalerweise beim Herunterfahren auf. Es ist jedoch auch möglich, dass eine Region entfernt wird, während der Simulator läuft.
  • ür ein Shared-Region-Modul sollte dies aufgerufen werden, wenn der Simulator heruntergefahren wird. Aufgrund einer Regression in OpenSimulator 0.8 (und wahrscheinlich in vielen früheren Versionen) trat dies jedoch nicht auf. Dies ist im aktuellen Entwicklungscode festgelegt (ab Commit 889194d, 3. Juli 2014). In der Zwischenzeit besteht die einfachste Problemumgehung darin, die Anzahl der dem Modul hinzugefügten Szenen zu zählen und dann herunterzufahren, wenn die gleiche Anzahl entfernt wird. Dies wird jedoch verhindern, dass ein Simulator mit vorübergehend keinen Regionen betrieben werden kann (ein etwas kleinerer Anwendungsfall). Ein Beispiel für diesen Ansatz finden Sie unter https://github.com/justincc/EventRecordingModule/blob/master/src/EventRecorder/EventRecordingModule.cs

INonSharedRegionModule selbst enthält keine Methoden, einfach definiert als

public interface INonSharedRegionModule : IRegionModuleBase
{
}

ISharedRegionModule verfügt über eine zusätzliche Methode.

public interface ISharedRegionModule : IRegionModuleBase
{
    void PostInitialise();
}
Method Description
PostInitialise Garantiert, nachdem Initialise () für alle anderen Module aufgerufen wurde, aber bevor Module hinzugefügt werden.

[edit] Beispiel Region Modul

In diesem Beispiel wird davon ausgegangen, dass Sie die Datei verwenden, die sich bereits in der OpenSimulator-Quellstruktur (ab 0.7.1) unter OpenSim / Region / OptionalModules / Example / BareBonesNonShared / BareBonesNonSharedModule.cs befindet. Es gibt dort auch ein Beispiel für ein Shared-Modul. Um dies als separates Projekt zu erstellen, beachten Sie bitte die obigen Anweisungen.

BareBonesNonShreadModule ist sehr einfach. Es führt lediglich Aufrufe von IRegionModule-Methoden in den Prozess der Aktivierung des Moduls aus.

In der Quellstruktur ist die Attributzeile [Erweiterung ...] kommentiert. Sie können dies auskommentieren, OpenSimulator neu erstellen und starten, um das Modul in Aktion zu sehen.

using System;
using System.Reflection;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
 
[assembly: Addin("BareBonesNonSharedModule", "0.1")]
[assembly: AddinDependency("OpenSim", "0.5")]
 
namespace OpenSim.Region.OptionalModules.Example.BareBonesNonShared
{
    /// <summary>
    /// Simplest possible example of a non-shared region module.
    /// </summary>
    /// <remarks>
    /// This module is the simplest possible example of a non-shared region module (a module where each scene/region
    /// in the simulator has its own copy).
    ///
    /// When the module is enabled it will print messages when it receives certain events to the screen and the log
    /// file.
    /// </remarks>
    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BareBonesNonSharedModule")]
    public class BareBonesNonSharedModule : INonSharedRegionModule
    {
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
        public string Name { get { return "Bare Bones Non Shared Module"; } }        
 
        public Type ReplaceableInterface { get { return null; } }
 
        public void Initialise(IConfigSource source)
        {
            m_log.DebugFormat("[BARE BONES]: INITIALIZED MODULE");
        }
 
        public void Close()
        {
            m_log.DebugFormat("[BARE BONES]: CLOSED MODULE");
        }
 
        public void AddRegion(Scene scene)
        {
            m_log.DebugFormat("[BARE BONES]: REGION {0} ADDED", scene.RegionInfo.RegionName);
        }
 
        public void RemoveRegion(Scene scene)
        {
            m_log.DebugFormat("[BARE BONES]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
        }        
 
        public void RegionLoaded(Scene scene)
        {
            m_log.DebugFormat("[BARE BONES]: REGION {0} LOADED", scene.RegionInfo.RegionName);
        }                
    }
}

[edit] Aktivieren des Moduls

Das Erstellen des Modulcodes selbst reicht nicht aus, um es zu aktivieren. Um dies zu tun, müssen wir es für den Mono.Addins).

Dies geschieht beispielsweise, indem der Klasse ein Extension-Attribut hinzugefügt wird.

[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BareBonesNonSharedModule")]

Der wichtige Teil hier ist der "Pfad" Abschnitt "/ OpenSim / RegionModules" - so ruft OpenSimulator Module von Mono.Addins ab. Die ID kann für das Modul sinnvoll sein.

Neuere Mono-Versionen benötigen diese Art von Abschnitt auch vor der Namespace-Deklaration:

[assembly: Addin("BareBonesNonSharedModule", "0.1")]
[assembly: AddinDependency("OpenSim", "0.5")]

Zu Beginn der Modulquellcodedatei müssen Sie diese Zeile hinzufügen:

using Mono.Addins;

Und prebuild.xml muss eine solche Zeile für neuere Mono-Versionen enthalten:

<Reference name="Mono.Addins.dll"/>

[edit] Integration mit OpenSimulator

HINWEIS: Dieser Abschnitt ist sehr unvollständig und Teile sind veraltet. Wenn Sie etwas wissen müssen, fragen Sie bitte in den Mailinglisten von OpenSimulator, wo wir beide die Frage beantworten und die notwendige Dokumentation hier hinzufügen können.

Beachten Sie jedoch, dass OpenSimulator ein sehr junges Projekt ist und die internen Schnittstellen sich kurzfristig ändern können. In diesem Fall liegt es an Ihnen, Ihr Modul mit späteren Versionen von OpenSimulator auf dem neuesten Stand zu halten.

[edit] Zugängliche Objekte

In der AddRegion- Routine erhalten Sie Zugriff auf das Szenenobjekt für die Region, von hier aus können Sie in die Szene spinnen und Zugang zu vielen anderen interessanten Objekten erhalten.

  • scene.GetEntities() - gibt eine Liste aller Entitäten in der Umgebung zurück. Dies wird eine kombinierte Liste von SceneObjectGroups (Prim Sets) und ScenePresences (Avatars) sein.
  • scene.GetAvatars() - ruft nur die Avatare in der Szene ab (sehr praktisch zum Senden von Nachrichten an Clients)
  • scene.EventManager - Dies ist das Objekt, von dem aus Sie Callbacks für Szenenereignisse registrieren können. Einige Beispiele finden Sie unten.
  • scene.RegionInfo - Eigenschaften der Region

[edit] Veranstaltungen

Verschiedene Ereignisse im OpenSimulator (z. B. Avatare, die eine Region betreten, Chat) haben Ereignis-Hooks, die ein Modul abonnieren kann. Die wichtigsten Ereignisse sind in Scene.EventManager verfügbar.

In vielen Fällen möchten Sie in dem Thread, der das Ereignis auslöst, so wenig Arbeit wie möglich leisten, da viele aus zeitkritischen Bereichen im OpenSimulator-Code kommen (z. B. innerhalb der Hauptszenerahmenverarbeitung) oder Bereiche, in denen ein Überfall andere Störungen verursacht ( zB Ereignisse, die melden, dass ein Root-Agent angekommen ist).

Diese Ereignisse sind etwas grob und bereit, da sie ursprünglich für die interne Verwendung von OpenSimulator erstellt wurden und standardmäßig Module gestartet wurden, um sie zu verwenden. Daher gibt es eine Inkonsistenz mit Namen, Argumenten und den offengelegten Ereignissen. Seien Sie bitte darauf vorbereitet, dass sich all dies im Laufe der Zeit ändert oder durch angemessenere Ereignisse ersetzt wird.

[edit] Registrierung für Veranstaltungen

Am Beispiel des SunModule können wir den folgenden Code sehen:

In Initialise():

...
m_scene.EventManager.OnFrame += SunUpdate;
...

Ganz einfach, wir haben gerade den EventManager bekommen und die SunUpdate Methode als Callback für das OnFrame Event registriert. OnFrame wird jedes Mal ausgelöst, wenn es in Opensim einen Renderrahmen gibt, der ungefähr 20 Mal pro Sekunde ist. In diesem Fall solltest du also sehr vorsichtig mit den Aktionen sein, die du in diesem Event machst, da sie sich direkt auf die Performance des Szenen-Loops auswirken (lange Wartezeiten führen zu Lag-Symptomen für bewegte Avatare usw.) .

Hier ist die Funktion selbst

public void SunUpdate()
{
    // this code just means only do this on every 1000th frame, and don't do it if the sun is in a fixed possition
    if (((m_frame++%m_frame_mod) != 0) || !ready || sunFixed)
    {
        return;
    }
 
    GenSunPos();        // Generate shared values once
 
    List<ScenePresence> avatars = m_scene.GetAvatars();
    foreach (ScenePresence avatar in avatars)
    {
        if (!avatar.IsChildAgent)
            avatar.ControllingClient.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
    }
 
    // set estate settings for region access to sun position
    m_scene.RegionInfo.RegionSettings.SunVector = Position;
}

SunUpdate () nimmt keinen Parameter (einige Ereignisse erfordern sie möglicherweise). Es wird standardmäßig nur jedes 1000. Frame ausgelöst (m_frame_mod = 1000 in diesem Modul), so dass es nicht zu viele Zyklen dauert.

Damit sich die Sonnenposition für die Kunden ändert, muss ihnen gesagt werden, dass sie sich ändert. Dies geschieht, indem Sie eine Liste aller Avatare aus der Szene holen und dann die Sonnenposition nacheinander an sie senden. Darüber hinaus möchten Sie dies nur für Root-Agenten tun (Agenten, die tatsächlich einen angehängten Avatar haben, der sich bewegen kann, usw.). Updates, die an untergeordnete Agenten gesendet werden (die es Zuschauern ermöglichen, in benachbarte Regionen zu sehen), werden einfach ignoriert.

[edit] Verfügbare Ereignisse

Hier ist eine extrem unvollständige Liste der verfügbaren Ereignisse (die hoffentlich im Laufe der Zeit ausgefüllt werden sollte). Weitere Details finden Sie im OpenSimulator-Code selbst. Bitte beachten Sie auch, dass OpenSimulator noch in Entwicklung ist. Event-Parameter und Namen können sich im Laufe der Zeit ändern.

In der nachstehenden Tabelle signalisieren die Verzögerungsspalten, ob eine Verzögerung bei der Verarbeitung des Ereignisses wahrscheinlich den Simulator als Ganzes und / oder die betreffende Entität (z. B. einen Benutzer) stören wird. Beachten Sie jedoch, dass selbst wenn es keine sofortige Unterbrechung durch das Verzögern eines Ereignis-Threads gibt, das Verzögern von vielen zu Simulator-weiten Problemen führen wird, da der Threadpool erschöpft ist.

[edit] In OpenSim.Region.Framework.Scenes.EventManager

Event name Parameters Delay can disrupt simulator Delay can disrupt user Description
OnClientLogin IClientAPI client No Yes Wird in der Region ausgelöst, die von einem Client bei der ersten Anmeldung eingegeben wird. Eine Verzögerung bei der Verarbeitung dieses Ereignisses hält den Eintritt des Avatars in die Szene aufrecht.
OnSetRootAgentScene UUID agentID, Scene scene No Yes Wird ausgelöst, wenn ein Avatar eine Szene betritt und bevor irgendwelche Einrichtungsarbeiten ausgeführt wurden (z. B. Initialisierung von Anlagen usw.). Eine Verzögerung bei der Verarbeitung dieses Ereignisses wird den Eintritt des Avatars in die Szene aufhalten, was ein besonderes Problem bei Regionsüberquerungen sein kann.
OnMakeRootAgent ScenePresence presence No Yes Wird ausgelöst, wenn ein Avatar eine Szene betritt und nachdem die Einrichtungsarbeiten ausgeführt wurden (Wiederherstellung von Anlagendaten usw.). Eine Verzögerung bei der Verarbeitung dieses Ereignisses wird den Eintritt des Avatars in die Szene aufhalten, was ein besonderes Problem bei Regionsüberquerungen sein kann. Sie können ScenePresence.TeleportFlags anzeigen, um festzustellen, ob dies der anfängliche Anmeldebereich für den Viewer (ViaLogin) ist oder ob der Avatar diesen in einer vorhandenen Sitzung eingibt.
OnMakeChildAgent ScenePresence presence No Yes Wird ausgelöst, wenn ein Avatar von einem Stammagenten in einen Kindagenten konvertiert wird. Dies geschieht, wenn sich ein Avatar von einer Szene wegbewegt, entweder durch Teleportieren oder Regions-Cross. Es wird nicht ausgelöst, wenn ein Avatar sich direkt abmeldet. Eine Verzögerung bei der Verarbeitung dieses Ereignisses sollte keine zu große Unterbrechung für den Avatar verursachen, der sich wegbewegt, obwohl eine lange Verzögerung sie daran hindern kann, erneut in die Szene einzutreten.
OnClientClosed UUID agentID, Scene scene No Yes Wird ausgelöst, wenn ein Client geschlossen wird. Dies kann entweder daran liegen, dass ein untergeordneter Agent nicht mehr benötigt wird oder sich der Benutzer direkt aus dieser Region abmeldet. Wenn Sie zwischen diesen beiden Ereignissen unterscheiden möchten, müssen Sie die ScenePresence.IsChildAgent-Eigenschaft überprüfen. Zu diesem Zeitpunkt ist der Agent noch vollständig (z. B. sind Anhänge für ihn registriert) und er wird im Szenegraph angezeigt. Eine Verzögerung bei der Verarbeitung dieses Ereignisses kann Probleme verursachen, wenn der Benutzer versucht, den Simulator erneut zu betreten, bevor die Verzögerung abgeschlossen ist.

[edit] Where to go from here

  • Getting Started with Region Modules -- die Hello World of OpenSimulator-Anwendungsentwicklung. Eher alt, aber immer noch einen Blick wert.
  • http://bluewallvirtual.com/example_region_module - Ein Beispielcode für einen gemeinsam genutzten Regionsmodul von Bluewall.
  • Development discussion of the current region module mechanism
  • Lesen Sie die Quelle für vorhandene openSIM-Kernmodule. Diese befinden sich in den Projekten OpenSim.Region.CoreModules und OpenSim.Region.OptionalModules. Durch diesen Code zu schauen, ist eine sehr gute Möglichkeit, herauszufinden, welche Region Module können und wie sie es tun können.
  • Lesen Sie den Quellcode für die EventManager-Klasse im OpenSim.Region.Framework.Scenes-Projekt. Diese listen die vielen vorhandenen Ereignisse auf. Einige Module können auch eigene Ereignisse exportieren (zB OnInventoryArchiveSaved im InventoryArchiverModule unter OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/).
  • Helfen Sie hier, einige Beispiele zu schreiben. OpenSimulator wächst mit Ihren Beiträgen.
Personal tools
General
About This Wiki