From 6db21bbf97b33bca017dcbc3b83687daa33f50b5 Mon Sep 17 00:00:00 2001
From: Homer Horwitz
Date: Mon, 13 Apr 2009 21:23:33 +0000
Subject: - Moved TerrainModule to the new region-module system. - Fixed some
locking issues. Either lock, or don't (if you don't have to). Only locking
access half of the time won't work reliably. - Had to adapt test helpers that
use the "old" IRegionModule. TerrainModule isn't one anymore.
---
.../Resources/CoreModulePlugin.addin.xml | 2 +-
.../CoreModules/World/Terrain/TerrainModule.cs | 70 ++++++++++++----------
OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs | 35 +++++++++--
3 files changed, 70 insertions(+), 37 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index 6db1042..8b5f26f 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 7793aa5..9f1867f 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -42,7 +42,7 @@ using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.CoreModules.World.Terrain
{
- public class TerrainModule : IRegionModule, ICommandableModule, ITerrainModule
+ public class TerrainModule : INonSharedRegionModule, ICommandableModule, ITerrainModule
{
#region StandardTerrainEffects enum
@@ -93,49 +93,62 @@ namespace OpenSim.Region.CoreModules.World.Terrain
#endregion
- #region IRegionModule Members
+ #region INonSharedRegionModule Members
///
/// Creates and initialises a terrain module for a region
///
/// Region initialising
/// Config for the region
- public void Initialise(Scene scene, IConfigSource config)
+ public void Initialise(IConfigSource config)
+ {
+ }
+
+ public void AddRegion(Scene scene)
{
m_scene = scene;
// Install terrain module in the simulator
- if (m_scene.Heightmap == null)
+ lock (m_scene)
{
- lock (m_scene)
+ if (m_scene.Heightmap == null)
{
m_channel = new TerrainChannel();
m_scene.Heightmap = m_channel;
m_revert = new TerrainChannel();
UpdateRevertMap();
}
- }
- else
- {
- m_channel = m_scene.Heightmap;
- m_revert = new TerrainChannel();
- UpdateRevertMap();
+ else
+ {
+ m_channel = m_scene.Heightmap;
+ m_revert = new TerrainChannel();
+ UpdateRevertMap();
+ }
+
+ m_scene.RegisterModuleInterface(this);
+ m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
+ m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
+ m_scene.EventManager.OnTerrainTick += EventManager_OnTerrainTick;
+ InstallInterfaces();
}
- m_scene.RegisterModuleInterface(this);
- m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
- m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
- m_scene.EventManager.OnTerrainTick += EventManager_OnTerrainTick;
+ InstallDefaultEffects();
+ LoadPlugins();
}
- ///
- /// Enables terrain module when called
- ///
- public void PostInitialise()
+ public void RemoveRegion(Scene scene)
{
- InstallDefaultEffects();
- InstallInterfaces();
- LoadPlugins();
+ lock (m_scene)
+ {
+ // remove the commands
+ m_scene.UnregisterModuleCommander(m_commander.Name);
+ // remove the event-handlers
+ m_scene.EventManager.OnTerrainTick -= EventManager_OnTerrainTick;
+ m_scene.EventManager.OnPluginConsole -= EventManager_OnPluginConsole;
+ m_scene.EventManager.OnNewClient -= EventManager_OnNewClient;
+ // remove the interface
+ m_scene.UnregisterModuleInterface(this);
+ }
}
public void Close()
@@ -147,11 +160,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain
get { return "TerrainModule"; }
}
- public bool IsSharedModule
- {
- get { return false; }
- }
-
#endregion
#region ITerrainModule Members
@@ -207,7 +215,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
return;
}
}
-
+
m_log.Error("[TERRAIN]: Unable to load heightmap, no file loader available for that format.");
throw new TerrainException(String.Format("unable to load heightmap from file {0}: no loader available for that format", filename));
}
@@ -268,7 +276,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
throw new TerrainException(String.Format("unable to load heightmap: parser {0} does not support loading", loader.Value));
}
}
-
+
CheckForTerrainUpdates();
m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully");
return;
@@ -288,7 +296,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
public void ModifyTerrain(UUID user, Vector3 pos, byte size, byte action, UUID agentId)
{
client_OnModifyTerrain(user, (float)pos.Z, (float)0.25, size, action, pos.Y, pos.X, pos.Y, pos.X, agentId);
- }
+ }
///
/// Saves the current heightmap to a specified stream.
@@ -501,7 +509,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
m_commander.ProcessConsoleCommand("help", new string[0]);
return;
}
-
+
string[] tmpArgs = new string[args.Length - 2];
int i;
for (i = 2; i < args.Length; i++)
diff --git a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
index d4c2daa..8f2f5a0 100644
--- a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
+++ b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
@@ -27,6 +27,7 @@
using System;
using System.Net;
+using System.Collections.Generic;
using Nini.Config;
using OpenMetaverse;
using OpenSim.Framework;
@@ -109,7 +110,7 @@ namespace OpenSim.Tests.Common.Setup
///
///
///
- public static void SetupSceneModules(Scene scene, params IRegionModule[] modules)
+ public static void SetupSceneModules(Scene scene, params object[] modules)
{
SetupSceneModules(scene, null, modules);
}
@@ -120,12 +121,36 @@ namespace OpenSim.Tests.Common.Setup
///
///
///
- public static void SetupSceneModules(Scene scene, IConfigSource config, params IRegionModule[] modules)
+ public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules)
{
- foreach (IRegionModule module in modules)
+ List newModules = new List();
+ foreach (object module in modules)
{
- module.Initialise(scene, config);
- scene.AddModule(module.Name, module);
+ if (module is IRegionModule)
+ {
+ IRegionModule m = (IRegionModule)module;
+ m.Initialise(scene, config);
+ scene.AddModule(m.Name, m);
+ }
+ else if(module is IRegionModuleBase)
+ {
+ // for the new system, everything has to be initialised first,
+ // shared modules have to be post-initialised, then all get an AddRegion with the scene
+ IRegionModuleBase m = (IRegionModuleBase)module;
+ m.Initialise(config);
+ newModules.Add(m);
+ }
+ }
+
+ foreach (IRegionModuleBase module in newModules)
+ {
+ if (module is ISharedRegionModule) ((ISharedRegionModule)module).PostInitialise();
+ }
+
+ foreach (IRegionModuleBase module in newModules)
+ {
+ module.AddRegion(scene);
+ scene.AddRegionModule(module.Name, module);
}
scene.SetModuleInterfaces();
--
cgit v1.1