<?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/index.php?action=history&amp;feed=atom&amp;title=New_Region_Modules%2Fde</id>
		<title>New Region Modules/de - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=New_Region_Modules%2Fde"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=New_Region_Modules/de&amp;action=history"/>
		<updated>2026-05-31T08:01:57Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/index.php?title=New_Region_Modules/de&amp;diff=55055&amp;oldid=prev</id>
		<title>Manni at 09:53, 16 December 2025</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=New_Region_Modules/de&amp;diff=55055&amp;oldid=prev"/>
				<updated>2025-12-16T09:53:09Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 09:53, 16 December 2025&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Quicklinks|New_Region_Modules}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Quicklinks|New_Region_Modules}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;= New Region Modules =&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Hinweis:''' Diese Dokumentation ist für OpenSimulator Version 0.9.3.x aktualisiert, das auf .NET 8.0 Runtime läuft.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Hinweis:''' Diese Dokumentation ist für OpenSimulator Version 0.9.3.x aktualisiert, das auf .NET 8.0 Runtime läuft.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Manni</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/index.php?title=New_Region_Modules/de&amp;diff=55054&amp;oldid=prev</id>
		<title>Manni: Created page with &quot;{{Quicklinks|New_Region_Modules}}  '''Hinweis:''' Diese Dokumentation ist für OpenSimulator Version 0.9.3.x aktualisiert, das auf .NET 8.0 Runtime läuft.  = Übersicht =  Di...&quot;</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=New_Region_Modules/de&amp;diff=55054&amp;oldid=prev"/>
				<updated>2025-12-16T09:52:35Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Quicklinks|New_Region_Modules}}  &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Diese Dokumentation ist für OpenSimulator Version 0.9.3.x aktualisiert, das auf .NET 8.0 Runtime läuft.  = Übersicht =  Di...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Quicklinks|New_Region_Modules}}&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Dokumentation ist für OpenSimulator Version 0.9.3.x aktualisiert, das auf .NET 8.0 Runtime läuft.&lt;br /&gt;
&lt;br /&gt;
= Übersicht =&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt das OpenSimulator Region-Modul-System, das eine flexible, erweiterbare Architektur zum Hinzufügen von Funktionalität zu Regionen bereitstellt. Region-Module ermöglichen es Entwicklern, OpenSim zu erweitern, ohne die Kern-Codebasis zu ändern, und unterstützen dynamisches Laden, Region-Neustarts und Hot-Swapping von Funktionalität.&lt;br /&gt;
&lt;br /&gt;
= Warum neue Region-Module? =&lt;br /&gt;
&lt;br /&gt;
Das vorherige RegionModule-System hatte mehrere Einschränkungen:&lt;br /&gt;
&lt;br /&gt;
* '''Inkonsistente API:''' Der Initialisierungs-Lebenszyklus unterstützte dynamisches Region-Management nicht richtig&lt;br /&gt;
* '''Region-Neustart-Probleme:''' Das Hinzufügen oder Entfernen von Regionen zur Laufzeit war problematisch&lt;br /&gt;
* '''Unklare Semantik:''' Die Beziehung zwischen ''Initialise'' und ''PostInitialise'' war mehrdeutig&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel, wenn eine neue Region hinzugefügt wurde:&lt;br /&gt;
* '''Initialise nicht aufrufen:''' Modul ist für diese Region nicht initialisiert → fehlende Funktionalität&lt;br /&gt;
* '''Initialise aufrufen:''' ''PostInitialise'' wurde bereits aufgerufen → inkonsistenter Zustand&lt;br /&gt;
&lt;br /&gt;
Das neue System behebt diese Probleme mit einem gut definierten Lebenszyklus und klarer Semantik für geteilte vs. nicht-geteilte Module.&lt;br /&gt;
&lt;br /&gt;
= Modultypen =&lt;br /&gt;
&lt;br /&gt;
Das neue Region-Modul-System basiert auf drei Interfaces:&lt;br /&gt;
&lt;br /&gt;
== IRegionModuleBase ==&lt;br /&gt;
&lt;br /&gt;
Das Basis-Interface, das alle Region-Module implementieren:&lt;br /&gt;
&lt;br /&gt;
  public interface IRegionModuleBase&lt;br /&gt;
  {&lt;br /&gt;
      string Name { get; }&lt;br /&gt;
      Type ReplaceableInterface { get; }&lt;br /&gt;
      void Initialise(IConfigSource source);&lt;br /&gt;
      void Close();&lt;br /&gt;
      void AddRegion(Scene scene);&lt;br /&gt;
      void RegionLoaded(Scene scene);&lt;br /&gt;
      void RemoveRegion(Scene scene);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Interface-Mitglieder ===&lt;br /&gt;
&lt;br /&gt;
* '''Name:''' Gibt den Namen des Moduls zurück (wird für Identifikation und Logging verwendet)&lt;br /&gt;
* '''ReplaceableInterface:''' Gibt den Typ des Interfaces zurück, das dieses Modul bereitstellt (für Modul-Ersetzung)&lt;br /&gt;
* '''Initialise:''' Wird einmal aufgerufen, wenn das Modul geladen wird&lt;br /&gt;
* '''Close:''' Wird aufgerufen, wenn das Modul heruntergefahren wird&lt;br /&gt;
* '''AddRegion:''' Wird aufgerufen, wenn eine Region zu diesem Modul hinzugefügt wird&lt;br /&gt;
* '''RegionLoaded:''' Wird aufgerufen, nachdem alle Module zu einer Region hinzugefügt wurden&lt;br /&gt;
* '''RemoveRegion:''' Wird aufgerufen, wenn eine Region von diesem Modul entfernt wird&lt;br /&gt;
&lt;br /&gt;
== ISharedRegionModule ==&lt;br /&gt;
&lt;br /&gt;
Für Module, die einmal instanziiert werden und über alle Regionen hinweg geteilt werden:&lt;br /&gt;
&lt;br /&gt;
  public interface ISharedRegionModule : IRegionModuleBase&lt;br /&gt;
  {&lt;br /&gt;
      void PostInitialise();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Anwendungsfälle:'''&lt;br /&gt;
* Zentrale Dienste (Benutzerverwaltung, Asset-Dienste, etc.)&lt;br /&gt;
* Regions-übergreifende Funktionalität&lt;br /&gt;
* Singleton-Pattern-Anforderungen&lt;br /&gt;
* Ressourcenintensive Module, die nur einmal existieren sollten&lt;br /&gt;
&lt;br /&gt;
'''Lebenszyklus:'''&lt;br /&gt;
* Eine Instanz wird beim Serverstart erstellt&lt;br /&gt;
* ''Initialise'' wird einmal aufgerufen&lt;br /&gt;
* ''PostInitialise'' wird aufgerufen, nachdem alle geteilten Module initialisiert sind&lt;br /&gt;
* ''AddRegion'' wird für jede Region aufgerufen&lt;br /&gt;
* ''RegionLoaded'' wird für jede Region aufgerufen, nachdem alle Module hinzugefügt wurden&lt;br /&gt;
* ''RemoveRegion'' wird aufgerufen, wenn Regionen entfernt werden&lt;br /&gt;
* ''Close'' wird beim Server-Herunterfahren aufgerufen&lt;br /&gt;
&lt;br /&gt;
== INonSharedRegionModule ==&lt;br /&gt;
&lt;br /&gt;
Für Module, die separat für jede Region instanziiert werden:&lt;br /&gt;
&lt;br /&gt;
  public interface INonSharedRegionModule : IRegionModuleBase&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Anwendungsfälle:'''&lt;br /&gt;
* Regions-spezifische Funktionalität&lt;br /&gt;
* Module, die regionsspezifischen Status verwalten&lt;br /&gt;
* Module, die Isolation zwischen Regionen benötigen&lt;br /&gt;
* Leistungskritische Module, die von Parallelisierung profitieren&lt;br /&gt;
&lt;br /&gt;
'''Lebenszyklus:'''&lt;br /&gt;
* Neue Instanz wird für jede Region erstellt&lt;br /&gt;
* ''Initialise'' wird aufgerufen, wenn die Modul-Instanz erstellt wird&lt;br /&gt;
* ''AddRegion'' wird unmittelbar nach der Initialisierung aufgerufen&lt;br /&gt;
* ''RegionLoaded'' wird aufgerufen, nachdem alle Module zur Region hinzugefügt wurden&lt;br /&gt;
* ''RemoveRegion'' wird aufgerufen, wenn die Region entfernt wird&lt;br /&gt;
* ''Close'' wird nach dem Entfernen der Region aufgerufen&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' ''PostInitialise'' existiert nicht für nicht-geteilte Module, weil es keinen garantierten Punkt gibt, an dem alle Instanzen erstellt wurden (neue Regionen können jederzeit hinzugefügt werden).&lt;br /&gt;
&lt;br /&gt;
= Ein Region-Modul erstellen =&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Erforderliche Referenzen hinzufügen ===&lt;br /&gt;
&lt;br /&gt;
Fügen Sie die notwendigen Namespaces in Ihren Code ein:&lt;br /&gt;
&lt;br /&gt;
  using System;&lt;br /&gt;
  using Mono.Addins;&lt;br /&gt;
  using Nini.Config;&lt;br /&gt;
  using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
  using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
&lt;br /&gt;
Ihr Projekt benötigt Referenzen zu:&lt;br /&gt;
* Mono.Addins.dll&lt;br /&gt;
* Nini.dll&lt;br /&gt;
* OpenSim.Region.Framework.dll&lt;br /&gt;
* OpenSim.Framework.dll&lt;br /&gt;
&lt;br /&gt;
=== 2. Assembly-Attribute ===&lt;br /&gt;
&lt;br /&gt;
Fügen Sie diese Attribute zu Ihrer Assembly hinzu (typischerweise in Properties/AssemblyInfo.cs oder am Anfang Ihrer Haupt-Moduldatei):&lt;br /&gt;
&lt;br /&gt;
  [assembly: Addin(&amp;quot;MyModule&amp;quot;, OpenSim.VersionInfo.VersionNumber + &amp;quot;.1&amp;quot;)]&lt;br /&gt;
  [assembly: AddinDependency(&amp;quot;OpenSim.Region.Framework&amp;quot;, OpenSim.VersionInfo.VersionNumber)]&lt;br /&gt;
&lt;br /&gt;
'''Parameter:'''&lt;br /&gt;
* '''Erster Parameter:''' Der eindeutige Name Ihres Moduls&lt;br /&gt;
* '''Version:''' An OpenSim-Version gebunden für Kompatibilitätsverfolgung&lt;br /&gt;
* '''AddinDependency:''' Deklariert Abhängigkeit von OpenSim.Region.Framework&lt;br /&gt;
&lt;br /&gt;
=== 3. Modul-Klassen-Attribut ===&lt;br /&gt;
&lt;br /&gt;
Markieren Sie Ihre Modul-Klasse mit dem Extension-Attribut:&lt;br /&gt;
&lt;br /&gt;
  [Extension(Path = &amp;quot;/OpenSim/RegionModules&amp;quot;, NodeName = &amp;quot;RegionModule&amp;quot;, Id = &amp;quot;MyModuleId&amp;quot;)]&lt;br /&gt;
  public class MyModule : ISharedRegionModule&lt;br /&gt;
  {&lt;br /&gt;
      // Implementierung&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Der Path und NodeName müssen genau wie gezeigt sein. Die Id sollte für Ihr Modul eindeutig sein.&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Geteiltes Region-Modul ==&lt;br /&gt;
&lt;br /&gt;
  using System;&lt;br /&gt;
  using System.Reflection;&lt;br /&gt;
  using log4net;&lt;br /&gt;
  using Mono.Addins;&lt;br /&gt;
  using Nini.Config;&lt;br /&gt;
  using OpenSim.Region.Framework.Interfaces;&lt;br /&gt;
  using OpenSim.Region.Framework.Scenes;&lt;br /&gt;
  &lt;br /&gt;
  [assembly: Addin(&amp;quot;ExampleSharedModule&amp;quot;, OpenSim.VersionInfo.VersionNumber + &amp;quot;.1&amp;quot;)]&lt;br /&gt;
  [assembly: AddinDependency(&amp;quot;OpenSim.Region.Framework&amp;quot;, OpenSim.VersionInfo.VersionNumber)]&lt;br /&gt;
  &lt;br /&gt;
  namespace MyNamespace&lt;br /&gt;
  {&lt;br /&gt;
      [Extension(Path = &amp;quot;/OpenSim/RegionModules&amp;quot;, NodeName = &amp;quot;RegionModule&amp;quot;, Id = &amp;quot;ExampleSharedModule&amp;quot;)]&lt;br /&gt;
      public class ExampleSharedModule : ISharedRegionModule&lt;br /&gt;
      {&lt;br /&gt;
          private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
          private bool m_enabled = false;&lt;br /&gt;
          private List&amp;lt;Scene&amp;gt; m_scenes = new List&amp;lt;Scene&amp;gt;();&lt;br /&gt;
          &lt;br /&gt;
          public string Name &lt;br /&gt;
          { &lt;br /&gt;
              get { return &amp;quot;ExampleSharedModule&amp;quot;; } &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public Type ReplaceableInterface &lt;br /&gt;
          { &lt;br /&gt;
              get { return null; } &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void Initialise(IConfigSource config)&lt;br /&gt;
          {&lt;br /&gt;
              IConfig moduleConfig = config.Configs[&amp;quot;ExampleModule&amp;quot;];&lt;br /&gt;
              if (moduleConfig != null)&lt;br /&gt;
              {&lt;br /&gt;
                  m_enabled = moduleConfig.GetBoolean(&amp;quot;Enabled&amp;quot;, false);&lt;br /&gt;
                  m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Enabled = {0}&amp;quot;, m_enabled);&lt;br /&gt;
              }&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void PostInitialise()&lt;br /&gt;
          {&lt;br /&gt;
              if (!m_enabled)&lt;br /&gt;
                  return;&lt;br /&gt;
                  &lt;br /&gt;
              m_log.Info(&amp;quot;[EXAMPLE MODULE]: PostInitialise aufgerufen&amp;quot;);&lt;br /&gt;
              // Geteilte Ressourcen hier initialisieren&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void AddRegion(Scene scene)&lt;br /&gt;
          {&lt;br /&gt;
              if (!m_enabled)&lt;br /&gt;
                  return;&lt;br /&gt;
                  &lt;br /&gt;
              m_scenes.Add(scene);&lt;br /&gt;
              m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Region {0} hinzugefügt&amp;quot;, scene.RegionInfo.RegionName);&lt;br /&gt;
              &lt;br /&gt;
              // Interfaces registrieren&lt;br /&gt;
              scene.RegisterModuleInterface&amp;lt;IExampleModule&amp;gt;(this);&lt;br /&gt;
              &lt;br /&gt;
              // Events anhängen&lt;br /&gt;
              scene.EventManager.OnNewClient += OnNewClient;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void RegionLoaded(Scene scene)&lt;br /&gt;
          {&lt;br /&gt;
              if (!m_enabled)&lt;br /&gt;
                  return;&lt;br /&gt;
                  &lt;br /&gt;
              m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Region {0} geladen&amp;quot;, scene.RegionInfo.RegionName);&lt;br /&gt;
              &lt;br /&gt;
              // Andere Module hier zugreifen&lt;br /&gt;
              // var otherModule = scene.RequestModuleInterface&amp;lt;IOtherModule&amp;gt;();&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void RemoveRegion(Scene scene)&lt;br /&gt;
          {&lt;br /&gt;
              if (!m_enabled)&lt;br /&gt;
                  return;&lt;br /&gt;
                  &lt;br /&gt;
              m_scenes.Remove(scene);&lt;br /&gt;
              &lt;br /&gt;
              // Events abhängen&lt;br /&gt;
              scene.EventManager.OnNewClient -= OnNewClient;&lt;br /&gt;
              &lt;br /&gt;
              // Interfaces abmelden&lt;br /&gt;
              scene.UnregisterModuleInterface&amp;lt;IExampleModule&amp;gt;(this);&lt;br /&gt;
              &lt;br /&gt;
              m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Region {0} entfernt&amp;quot;, scene.RegionInfo.RegionName);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          public void Close()&lt;br /&gt;
          {&lt;br /&gt;
              m_log.Info(&amp;quot;[EXAMPLE MODULE]: Wird heruntergefahren&amp;quot;);&lt;br /&gt;
              // Geteilte Ressourcen aufräumen&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          private void OnNewClient(IClientAPI client)&lt;br /&gt;
          {&lt;br /&gt;
              // Neuen Client behandeln&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Nicht-geteiltes Region-Modul ==&lt;br /&gt;
&lt;br /&gt;
  [Extension(Path = &amp;quot;/OpenSim/RegionModules&amp;quot;, NodeName = &amp;quot;RegionModule&amp;quot;, Id = &amp;quot;ExampleNonSharedModule&amp;quot;)]&lt;br /&gt;
  public class ExampleNonSharedModule : INonSharedRegionModule&lt;br /&gt;
  {&lt;br /&gt;
      private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;
      private bool m_enabled = false;&lt;br /&gt;
      private Scene m_scene;&lt;br /&gt;
      &lt;br /&gt;
      public string Name &lt;br /&gt;
      { &lt;br /&gt;
          get { return &amp;quot;ExampleNonSharedModule&amp;quot;; } &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public Type ReplaceableInterface &lt;br /&gt;
      { &lt;br /&gt;
          get { return null; } &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void Initialise(IConfigSource config)&lt;br /&gt;
      {&lt;br /&gt;
          IConfig moduleConfig = config.Configs[&amp;quot;ExampleModule&amp;quot;];&lt;br /&gt;
          if (moduleConfig != null)&lt;br /&gt;
          {&lt;br /&gt;
              m_enabled = moduleConfig.GetBoolean(&amp;quot;Enabled&amp;quot;, false);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void AddRegion(Scene scene)&lt;br /&gt;
      {&lt;br /&gt;
          if (!m_enabled)&lt;br /&gt;
              return;&lt;br /&gt;
              &lt;br /&gt;
          m_scene = scene;&lt;br /&gt;
          m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Zur Region {0} hinzugefügt&amp;quot;, scene.RegionInfo.RegionName);&lt;br /&gt;
          &lt;br /&gt;
          scene.RegisterModuleInterface&amp;lt;IExampleModule&amp;gt;(this);&lt;br /&gt;
          scene.EventManager.OnFrame += OnFrame;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void RegionLoaded(Scene scene)&lt;br /&gt;
      {&lt;br /&gt;
          if (!m_enabled)&lt;br /&gt;
              return;&lt;br /&gt;
              &lt;br /&gt;
          // Andere Module zugreifen&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void RemoveRegion(Scene scene)&lt;br /&gt;
      {&lt;br /&gt;
          if (!m_enabled)&lt;br /&gt;
              return;&lt;br /&gt;
              &lt;br /&gt;
          scene.EventManager.OnFrame -= OnFrame;&lt;br /&gt;
          scene.UnregisterModuleInterface&amp;lt;IExampleModule&amp;gt;(this);&lt;br /&gt;
          &lt;br /&gt;
          m_log.InfoFormat(&amp;quot;[EXAMPLE MODULE]: Von Region {0} entfernt&amp;quot;, scene.RegionInfo.RegionName);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void Close()&lt;br /&gt;
      {&lt;br /&gt;
          // Regionsspezifische Ressourcen aufräumen&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      private void OnFrame()&lt;br /&gt;
      {&lt;br /&gt;
          // Regionsspezifische Frame-Verarbeitung&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
= Modul-Lebenszyklus =&lt;br /&gt;
&lt;br /&gt;
== Server-Start ==&lt;br /&gt;
&lt;br /&gt;
'''1. Modul-Laden'''&lt;br /&gt;
* Region-Server startet&lt;br /&gt;
* Alle Modul-Klassen werden über Mono.Addins geladen (keine bestimmte Reihenfolge)&lt;br /&gt;
&lt;br /&gt;
'''2. Geteilte Modul-Initialisierung'''&lt;br /&gt;
* Für jedes ''ISharedRegionModule'': Eine Instanz wird erstellt, ''Initialise'' wird aufgerufen&lt;br /&gt;
* Für jedes ''ISharedRegionModule'': ''PostInitialise'' wird aufgerufen&lt;br /&gt;
&lt;br /&gt;
'''3. Scene-Erstellung (für jede Scene)'''&lt;br /&gt;
* Für jedes ''INonSharedRegionModule'': Neue Instanz wird erstellt, ''Initialise'' wird aufgerufen&lt;br /&gt;
* Für alle Module (geteilt und nicht-geteilt): ''AddRegion(scene)'' wird aufgerufen&lt;br /&gt;
* Module werden mit der Scene verknüpft&lt;br /&gt;
* Für alle Module: ''RegionLoaded(scene)'' wird aufgerufen&lt;br /&gt;
* An diesem Punkt können Module auf andere Module über ''scene.RequestModuleInterface&amp;lt;T&amp;gt;()'' zugreifen&lt;br /&gt;
&lt;br /&gt;
== Eine Region hinzufügen (Laufzeit) ==&lt;br /&gt;
&lt;br /&gt;
* Für jedes ''INonSharedRegionModule'': Neue Instanz wird erstellt, ''Initialise'' wird aufgerufen&lt;br /&gt;
* Für alle Module (geteilt und nicht-geteilt): ''AddRegion(scene)'' wird aufgerufen&lt;br /&gt;
* Für alle Module: ''RegionLoaded(scene)'' wird aufgerufen&lt;br /&gt;
&lt;br /&gt;
== Eine Region entfernen ==&lt;br /&gt;
&lt;br /&gt;
* Für alle Module (geteilt und nicht-geteilt): ''RemoveRegion(scene)'' wird aufgerufen&lt;br /&gt;
* Nur für ''INonSharedRegionModule''s: ''Close'' wird aufgerufen&lt;br /&gt;
* Modul-Referenzen werden aus der Scene entfernt&lt;br /&gt;
* ''INonSharedRegionModule''-Instanzen können vom Garbage Collector erfasst werden&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Aufgrund des Verhaltens der .NET/Mono-Laufzeitumgebung werden einige Ressourcen möglicherweise nicht sofort freigegeben, selbst bei ordnungsgemäßer Bereinigung.&lt;br /&gt;
&lt;br /&gt;
== Eine Region neu starten ==&lt;br /&gt;
&lt;br /&gt;
Ein Region-Neustart wird implementiert als:&lt;br /&gt;
1. [[#Eine_Region_entfernen|Region entfernen]]&lt;br /&gt;
2. [[#Eine_Region_hinzuf.C3.BCgen_.28Laufzeit.29|Region hinzufügen]]&lt;br /&gt;
&lt;br /&gt;
Avatare in der Region werden während des Neustarts getrennt.&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Aufgrund von .NET/Mono-Laufzeitbeschränkungen erfolgt möglicherweise kein echtes Entladen von Modulen. Einige Ressourcen können über Neustarts hinweg im Speicher verbleiben.&lt;br /&gt;
&lt;br /&gt;
== Server-Herunterfahren ==&lt;br /&gt;
&lt;br /&gt;
* Für jede Scene: [[#Eine_Region_entfernen|Region entfernen]]-Schritte werden durchgeführt&lt;br /&gt;
** ''RemoveRegion'' wird für alle Module aufgerufen&lt;br /&gt;
** ''Close'' wird für alle ''INonSharedRegionModule''s aufgerufen&lt;br /&gt;
* ''Close'' wird für alle ''ISharedRegionModule''s aufgerufen&lt;br /&gt;
* Module können vom Garbage Collector erfasst werden&lt;br /&gt;
&lt;br /&gt;
= Best Practices =&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie das ''enabled''-Muster für Module, die optional sein sollten:&lt;br /&gt;
&lt;br /&gt;
  [ExampleModule]&lt;br /&gt;
      Enabled = true&lt;br /&gt;
      ; Weitere Einstellungen...&lt;br /&gt;
&lt;br /&gt;
Überprüfen Sie dies in ''Initialise'' und kehren Sie früh zurück, wenn deaktiviert:&lt;br /&gt;
&lt;br /&gt;
  public void Initialise(IConfigSource config)&lt;br /&gt;
  {&lt;br /&gt;
      IConfig cfg = config.Configs[&amp;quot;ExampleModule&amp;quot;];&lt;br /&gt;
      if (cfg == null || !cfg.GetBoolean(&amp;quot;Enabled&amp;quot;, false))&lt;br /&gt;
          return;&lt;br /&gt;
          &lt;br /&gt;
      m_enabled = true;&lt;br /&gt;
      // Initialisierung fortsetzen...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Ressourcenverwaltung ==&lt;br /&gt;
&lt;br /&gt;
* '''In RemoveRegion aufräumen:''' Event-Handler abmelden, Interfaces abmelden&lt;br /&gt;
* '''In Close aufräumen:''' Ressourcen freigeben, Verbindungen schließen&lt;br /&gt;
* '''Operationen abgleichen:''' Was Sie in ''AddRegion'' hinzufügen, entfernen Sie in ''RemoveRegion''&lt;br /&gt;
* '''Memory Leaks vermeiden:''' Immer Event-Handler abhängen, um Referenzen zu vermeiden&lt;br /&gt;
&lt;br /&gt;
== Modul-Abhängigkeiten ==&lt;br /&gt;
&lt;br /&gt;
Greifen Sie auf andere Module in ''RegionLoaded'' zu, nicht in ''AddRegion'':&lt;br /&gt;
&lt;br /&gt;
  public void RegionLoaded(Scene scene)&lt;br /&gt;
  {&lt;br /&gt;
      // Sicher - alle Module wurden hinzugefügt&lt;br /&gt;
      IOtherModule other = scene.RequestModuleInterface&amp;lt;IOtherModule&amp;gt;();&lt;br /&gt;
      if (other != null)&lt;br /&gt;
      {&lt;br /&gt;
          // Modul verwenden&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Modultyp wählen ==&lt;br /&gt;
&lt;br /&gt;
'''Verwenden Sie ISharedRegionModule wenn:'''&lt;br /&gt;
* Modul Singleton-Dienste bereitstellt&lt;br /&gt;
* Modul regionsübergreifende Funktionalität verwaltet&lt;br /&gt;
* Modul ressourcenintensiv ist und nur einmal existieren sollte&lt;br /&gt;
* Beispiel: Asset-Service, Benutzerverwaltung&lt;br /&gt;
&lt;br /&gt;
'''Verwenden Sie INonSharedRegionModule wenn:'''&lt;br /&gt;
* Modul regionsspezifischen Status verwaltet&lt;br /&gt;
* Modul-Funktionalität regionsspezifisch ist&lt;br /&gt;
* Modul von Isolation zwischen Regionen profitiert&lt;br /&gt;
* Beispiel: Terrain-Modul, Vegetations-Modul&lt;br /&gt;
&lt;br /&gt;
== ReplaceableInterface ==&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie ''ReplaceableInterface'', um die Ersetzung Ihres Moduls zu ermöglichen:&lt;br /&gt;
&lt;br /&gt;
  public Type ReplaceableInterface &lt;br /&gt;
  { &lt;br /&gt;
      get { return typeof(IMyModuleInterface); } &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Dies ermöglicht es Drittanbieter-Modulen, Ihre Standard-Implementierung zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
= Bereitstellung =&lt;br /&gt;
&lt;br /&gt;
== Manuelle Bereitstellung ==&lt;br /&gt;
&lt;br /&gt;
1. Bauen Sie Ihre Modul-Assembly&lt;br /&gt;
2. Kopieren Sie die .dll in den bin-Ordner von OpenSim&lt;br /&gt;
3. Starten Sie OpenSim neu&lt;br /&gt;
4. Modul wird automatisch über Mono.Addins entdeckt und geladen&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Prebuild ==&lt;br /&gt;
&lt;br /&gt;
Für die Integration in das Build-System von OpenSim erstellen Sie einen prebuild.xml-Eintrag:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Project name=&amp;quot;OpenSim.Region.Modules.Example&amp;quot; path=&amp;quot;addon-modules/ExampleModule&amp;quot; type=&amp;quot;Library&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Configuration name=&amp;quot;Debug&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Options&amp;gt;&lt;br /&gt;
        &amp;lt;OutputPath&amp;gt;../../bin/&amp;lt;/OutputPath&amp;gt;&lt;br /&gt;
      &amp;lt;/Options&amp;gt;&lt;br /&gt;
    &amp;lt;/Configuration&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;ReferencePath&amp;gt;../../bin/&amp;lt;/ReferencePath&amp;gt;&lt;br /&gt;
    &amp;lt;Reference name=&amp;quot;Mono.Addins&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Reference name=&amp;quot;Nini&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Reference name=&amp;quot;log4net&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Reference name=&amp;quot;OpenSim.Region.Framework&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Reference name=&amp;quot;OpenSim.Framework&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Files&amp;gt;&lt;br /&gt;
      &amp;lt;Match pattern=&amp;quot;*.cs&amp;quot; recurse=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;/Project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung von .NET SDK-Projekten ==&lt;br /&gt;
&lt;br /&gt;
Moderne .NET 8.0-Projekte können SDK-Style .csproj verwenden:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
      &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
      &amp;lt;OutputPath&amp;gt;../../bin/&amp;lt;/OutputPath&amp;gt;&lt;br /&gt;
      &amp;lt;GenerateAssemblyInfo&amp;gt;false&amp;lt;/GenerateAssemblyInfo&amp;gt;&lt;br /&gt;
    &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
      &amp;lt;Reference Include=&amp;quot;Mono.Addins&amp;quot; HintPath=&amp;quot;../../bin/Mono.Addins.dll&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;ProjectReference Include=&amp;quot;../../OpenSim/Region/Framework/OpenSim.Region.Framework.csproj&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
  &amp;lt;/Project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fehlerbehebung =&lt;br /&gt;
&lt;br /&gt;
== Modul wird nicht geladen ==&lt;br /&gt;
&lt;br /&gt;
* Überprüfen Sie, ob das Extension-Attribut korrekt ist&lt;br /&gt;
* Prüfen Sie, ob Assembly-Attribute vorhanden sind&lt;br /&gt;
* Stellen Sie sicher, dass die Mono.Addins.dll-Referenz korrekt ist&lt;br /&gt;
* Überprüfen Sie das OpenSim-Log auf Addin-Ladefehler&lt;br /&gt;
* Überprüfen Sie, ob die .dll im bin-Verzeichnis liegt&lt;br /&gt;
&lt;br /&gt;
== Modul nicht gefunden ==&lt;br /&gt;
&lt;br /&gt;
* Überprüfen Sie, ob die Name-Eigenschaft des Moduls mit der Konfiguration übereinstimmt&lt;br /&gt;
* Überprüfen Sie, ob das Modul in der Konfiguration aktiviert ist&lt;br /&gt;
* Prüfen Sie auf Tippfehler im Extension-Id-Attribut&lt;br /&gt;
&lt;br /&gt;
== Methoden werden nicht aufgerufen ==&lt;br /&gt;
&lt;br /&gt;
* Überprüfen Sie, ob die Interface-Implementierung vollständig ist&lt;br /&gt;
* Prüfen Sie, ob m_enabled oder ähnliche Flags die Ausführung nicht verhindern&lt;br /&gt;
* Stellen Sie sicher, dass das Modul die Konfigurationsprüfungen in Initialise bestanden hat&lt;br /&gt;
&lt;br /&gt;
== Memory Leaks ==&lt;br /&gt;
&lt;br /&gt;
* Hängen Sie alle Event-Handler in RemoveRegion ab&lt;br /&gt;
* Melden Sie alle Modul-Interfaces ab&lt;br /&gt;
* Leeren Sie Collections und Referenzen in Close&lt;br /&gt;
* Verwenden Sie WeakReference für langlebige Referenzen, wenn angemessen&lt;br /&gt;
&lt;br /&gt;
== .NET 8.0 spezifische Probleme ==&lt;br /&gt;
&lt;br /&gt;
* Stellen Sie sicher, dass alle referenzierten Assemblies .NET 8.0-kompatibel sind&lt;br /&gt;
* Prüfen Sie auf veraltete API-Verwendung&lt;br /&gt;
* Überprüfen Sie, ob async/await-Muster korrekt verwendet werden&lt;br /&gt;
&lt;br /&gt;
= Erweiterte Themen =&lt;br /&gt;
&lt;br /&gt;
== Modul-Ersetzung ==&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie ''ReplaceableInterface'', um Modul-Ersetzung zu ermöglichen:&lt;br /&gt;
&lt;br /&gt;
  public Type ReplaceableInterface &lt;br /&gt;
  { &lt;br /&gt;
      get { return typeof(IMyService); } &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Der Loader wird:&lt;br /&gt;
1. Alle Module laden&lt;br /&gt;
2. Für Module mit ReplaceableInterface die Aktivierung aufschieben&lt;br /&gt;
3. Nur aktivieren, wenn kein anderes Modul dieses Interface registriert hat&lt;br /&gt;
&lt;br /&gt;
== Modul-übergreifende Kommunikation ==&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie Modul-Interfaces für die Kommunikation:&lt;br /&gt;
&lt;br /&gt;
  // Interface definieren&lt;br /&gt;
  public interface IMyModule&lt;br /&gt;
  {&lt;br /&gt;
      void DoSomething();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Im Modul implementieren&lt;br /&gt;
  public class MyModule : ISharedRegionModule, IMyModule&lt;br /&gt;
  {&lt;br /&gt;
      public void AddRegion(Scene scene)&lt;br /&gt;
      {&lt;br /&gt;
          scene.RegisterModuleInterface&amp;lt;IMyModule&amp;gt;(this);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      public void DoSomething()&lt;br /&gt;
      {&lt;br /&gt;
          // Implementierung&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Von einem anderen Modul aus verwenden&lt;br /&gt;
  public void RegionLoaded(Scene scene)&lt;br /&gt;
  {&lt;br /&gt;
      IMyModule myMod = scene.RequestModuleInterface&amp;lt;IMyModule&amp;gt;();&lt;br /&gt;
      if (myMod != null)&lt;br /&gt;
          myMod.DoSomething();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Leistungsüberlegungen ==&lt;br /&gt;
&lt;br /&gt;
* '''Geteilte Module:''' Geringerer Speicher-Overhead, potenzielle Engpässe&lt;br /&gt;
* '''Nicht-geteilte Module:''' Höhere Speichernutzung, bessere Parallelisierung&lt;br /&gt;
* '''Event-Handler:''' Seien Sie effizient, vermeiden Sie blockierende Operationen&lt;br /&gt;
* '''Asynchrone Operationen:''' Verwenden Sie Task-basierte async für langläufige Operationen&lt;br /&gt;
&lt;br /&gt;
= Siehe auch =&lt;br /&gt;
&lt;br /&gt;
* [[Developing OpenSim Addins]] - Erstellen von Addon-Paketen&lt;br /&gt;
* [[Installing 3rd party addins]] - Installation von Addons&lt;br /&gt;
* [http://opensimulator.org/wiki/ OpenSimulator Wiki] - Hauptdokumentation&lt;br /&gt;
&lt;br /&gt;
= Referenzen =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/opensim/opensim OpenSimulator GitHub Repository]&lt;br /&gt;
* [https://github.com/mono/mono-addins Mono.Addins Dokumentation]&lt;br /&gt;
* [http://opensimulator.org/ OpenSimulator Website]&lt;br /&gt;
&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Manni</name></author>	</entry>

	</feed>