From 648452dd91e07be4ec0e81793807e86bd48362c4 Mon Sep 17 00:00:00 2001 From: Homer Horwitz Date: Sun, 5 Apr 2009 17:08:11 +0000 Subject: [PATCH] - Add new RegionModulesControllerPlugin to the application modules - Change several classes to use the new plugin for handling of region-modules (NOTE: No regionmodule is using this yet) - Add necessary prebuild parts (don't forget to runprebuild) Attention: Work in progress. This shouldn't break anything, but you never know... --- .../RegionModulesControllerPlugin.cs | 192 ++++++++++++++++++ .../RegionModulesControllerPlugin.addin.xml | 13 ++ OpenSim/Region/Application/OpenSimBase.cs | 22 +- .../Resources/CoreModulePlugin.addin.xml | 20 ++ .../Resources/Wind.Models.addin.xml | 12 -- .../Interfaces/INonSharedRegionModule.cs | 35 ++++ .../Framework/Interfaces/IRegionModuleBase.cs | 76 +++++++ .../Interfaces/IRegionModulesController.cs | 38 ++++ .../Interfaces/ISharedRegionModule.cs | 40 ++++ OpenSim/Region/Framework/Scenes/SceneBase.cs | 65 +++++- bin/OpenSim.addin.xml | 8 + prebuild.xml | 29 +++ 12 files changed, 530 insertions(+), 20 deletions(-) create mode 100644 OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs create mode 100644 OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml create mode 100644 OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml delete mode 100644 OpenSim/Region/CoreModules/Resources/Wind.Models.addin.xml create mode 100644 OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs create mode 100644 OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs diff --git a/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs new file mode 100644 index 0000000000..7dc4a7440f --- /dev/null +++ b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs @@ -0,0 +1,192 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Mono.Addins; +using OpenSim; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.ApplicationPlugins.RegionModulesController +{ + public class RegionModulesControllerPlugin : IRegionModulesController, IApplicationPlugin + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private OpenSimBase m_openSim; // for getting the config + + private string m_name; + + private List m_nonSharedModules = new List(); + private List m_sharedModules = new List(); + + private List m_sharedInstances = new List(); + +#region IApplicationPlugin implementation + + public void Initialise (OpenSimBase openSim) + { + m_log.DebugFormat("[REGIONMODULES]: Initializing..."); + m_openSim = openSim; + openSim.ApplicationRegistry.RegisterInterface(this); + + string id = AddinManager.CurrentAddin.Id; + int pos = id.LastIndexOf("."); + if (pos == -1) m_name = id; + else m_name = id.Substring(pos + 1); + + ExtensionNodeList list = AddinManager.GetExtensionNodes("/OpenSim/RegionModules"); + m_log.DebugFormat("[XXX] list: {0}", list.Count); + // load all the (new) region-module classes + foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes("/OpenSim/RegionModules")) + { + m_log.DebugFormat("[REGIONMODULES]: Found node {0}", node.Id); + // TODO why does node.Type.isSubclassOf(typeof(ISharedRegionModule)) not work? + if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null) + { + m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type); + m_sharedModules.Add(node.Type); + } + else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null) + { + m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type); + m_nonSharedModules.Add(node.Type); + } + else + m_log.DebugFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type); + } + + // now we've got all the region-module classes loaded, create one instance of every ISharedRegionModule, + // initialize and postinitialize it. This Initialise we are in is called before LoadRegion.PostInitialise + // is called (which loads the regions), so we don't have any regions in the server yet. + foreach (Type type in m_sharedModules) + { + ISharedRegionModule module = (ISharedRegionModule)Activator.CreateInstance(type); + m_sharedInstances.Add(module); + module.Initialise(openSim.ConfigSource.Source); + } + + foreach (ISharedRegionModule module in m_sharedInstances) + { + module.PostInitialise(); + } + } + + public void PostInitialise () + { + } + +#endregion + +#region IPlugin implementation + + public void Initialise () + { + throw new System.NotImplementedException(); + } + +#endregion + +#region IDisposable implementation + + public void Dispose () + { + // we expect that all regions have been removed already + while (m_sharedInstances.Count > 0) + { + m_sharedInstances[0].Close(); + m_sharedInstances.RemoveAt(0); + } + m_sharedModules.Clear(); + m_nonSharedModules.Clear(); + } + +#endregion + + + public string Version + { + get + { + return AddinManager.CurrentAddin.Version; + } + } + + public string Name + { + get + { + return m_name; + } + } + +#region IRegionModulesController implementation + + public void AddRegionToModules (Scene scene) + { + foreach (ISharedRegionModule module in m_sharedInstances) + { + m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to shared module {1}", + scene.RegionInfo.RegionName, module.Name); + module.AddRegion(scene); + scene.AddRegionModule(module.Name, module); + } + + foreach (Type type in m_nonSharedModules) + { + INonSharedRegionModule module = (INonSharedRegionModule)Activator.CreateInstance(type); + m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to non-shared module {1}", + scene.RegionInfo.RegionName, module.Name); + module.Initialise(m_openSim.ConfigSource.Source); + module.AddRegion(scene); + scene.AddRegionModule(module.Name, module); + } + } + + public void RemoveRegionFromModules (Scene scene) + { + foreach (IRegionModuleBase module in scene.RegionModules.Values) + { + m_log.DebugFormat("[REGIONMODULE]: Removing scene {0} from module {1}", + scene.RegionInfo.RegionName, module.Name); + module.RemoveRegion(scene); + if (module is INonSharedRegionModule) + { + // as we were the only user, this instance has to die + module.Close(); + } + } + scene.RegionModules.Clear(); + } + +#endregion + + } +} diff --git a/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml b/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml new file mode 100644 index 0000000000..a92713bd15 --- /dev/null +++ b/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index f24cf9960e..fd3549e921 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -517,7 +517,7 @@ namespace OpenSim IClientNetworkServer clientServer; Scene scene = SetupScene(regionInfo, proxyOffset, m_config.Source, out clientServer); - m_log.Info("[MODULES]: Loading Region's modules"); + m_log.Info("[MODULES]: Loading Region's modules (old style)"); List modules = m_moduleLoader.PickupModules(scene, "."); @@ -525,6 +525,15 @@ namespace OpenSim // script module can pick up events exposed by a module m_moduleLoader.InitialiseSharedModules(scene); + // Use this in the future, the line above will be deprecated soon + m_log.Info("[MODULES]: Loading Region's modules (new style)"); + IRegionModulesController controller; + if (ApplicationRegistry.TryGet(out controller)) + { + controller.AddRegionToModules(scene); + } + else m_log.Error("[MODULES]: The new RegionModulesController is missing..."); + scene.SetModuleInterfaces(); // Prims have to be loaded after module configuration since some modules may be invoked during the load @@ -571,11 +580,22 @@ namespace OpenSim module.PostInitialise(); } } + scene.EventManager.OnShutdown += delegate() { ShutdownRegion(scene); }; mscene = scene; return clientServer; } + private void ShutdownRegion(Scene scene) + { + m_log.DebugFormat("[SHUTDOWN]: Shutting down region {0}", scene.RegionInfo.RegionName); + IRegionModulesController controller; + if (ApplicationRegistry.TryGet(out controller)) + { + controller.RemoveRegionFromModules(scene); + } + } + public void RemoveRegion(Scene scene, bool cleanup) { // only need to check this if we are not at the diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml new file mode 100644 index 0000000000..689687632b --- /dev/null +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Region/CoreModules/Resources/Wind.Models.addin.xml b/OpenSim/Region/CoreModules/Resources/Wind.Models.addin.xml deleted file mode 100644 index 7735826f2e..0000000000 --- a/OpenSim/Region/CoreModules/Resources/Wind.Models.addin.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs b/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs new file mode 100644 index 0000000000..b8af866199 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs @@ -0,0 +1,35 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface INonSharedRegionModule : IRegionModuleBase + { + } +} diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs b/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs new file mode 100644 index 0000000000..265b464b98 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs @@ -0,0 +1,76 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using Mono.Addins; +using Nini.Config; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRegionModuleBase + { + /// + /// The name of the module + /// + string Name { get; } + + /// + /// This is called to initialize the region module. For shared modules, this is called + /// exactly once, after creating the single (shared) instance. For non-shared modules, + /// this is called once on each instance, after the instace for the region has been created. + /// + /// + /// A + /// + void Initialise(IConfigSource source); + + /// + /// This is the inverse to . After a Close(), this instance won't be usable anymore. + /// + void Close(); + + /// + /// This is called whenever a is added. For shared modules, this can happen several times. + /// For non-shared modules, this happens exactly once, after has been called. + /// + /// + /// A + /// + void AddRegion(Scene scene); + + /// + /// This is called whenever a is removed. For shared modules, this can happen several times. + /// For non-shared modules, this happens exactly once, if the scene this instance is associated with is removed. + /// + /// + /// A + /// + void RemoveRegion(Scene scene); + } + +} diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs b/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs new file mode 100644 index 0000000000..d38c962a81 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs @@ -0,0 +1,38 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRegionModulesController + { + void AddRegionToModules(Scene scene); + void RemoveRegionFromModules (Scene scene); + } +} diff --git a/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs b/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs new file mode 100644 index 0000000000..d0b6eccc0c --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs @@ -0,0 +1,40 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface ISharedRegionModule : IRegionModuleBase + { + /// + /// This is called exactly once after all the shared region-modules have been instanciated and + /// d. + /// + void PostInitialise(); + } +} diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 3695b21240..42f3d971be 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -59,13 +59,19 @@ namespace OpenSim.Region.Framework.Scenes } protected Dictionary m_modules = new Dictionary(); + public Dictionary RegionModules + { + get { return m_regionModules; } + } + private Dictionary m_regionModules = new Dictionary(); + /// /// The module interfaces available from this scene. /// protected Dictionary> ModuleInterfaces = new Dictionary>(); protected Dictionary ModuleAPIMethods = new Dictionary(); - + /// /// The module commanders available from this scene /// @@ -235,7 +241,7 @@ namespace OpenSim.Region.Framework.Scenes } } Modules.Clear(); - + try { EventManager.TriggerShutdown(); @@ -278,6 +284,24 @@ namespace OpenSim.Region.Framework.Scenes } } + /// + /// Add a region-module to this scene. TODO: This will replace AddModule in the future. + /// + /// + /// + public void AddRegionModule(string name, IRegionModuleBase module) + { + if (!RegionModules.ContainsKey(name)) + { + RegionModules.Add(name, module); + } + } + + public void RemoveRegionModule(string name) + { + RegionModules.Remove(name); + } + /// /// Register a module commander. /// @@ -368,6 +392,25 @@ namespace OpenSim.Region.Framework.Scenes } } + public void UnregisterModuleInterface(M mod) + { + List l; + if (ModuleInterfaces.TryGetValue(typeof(M), out l)) + { + if (l.Remove(mod)) + { + if (mod is IEntityCreator) + { + IEntityCreator entityCreator = (IEntityCreator)mod; + foreach (PCode pcode in entityCreator.CreationCapabilities) + { + m_entityCreators[pcode] = null; + } + } + } + } + } + public void StackModuleInterface(M mod) { List l; @@ -462,11 +505,19 @@ namespace OpenSim.Region.Framework.Scenes if (mod != null) { - if (!(mod is IRegionModule)) - throw new Exception("AddCommand module parameter must be IRegionModule"); - IRegionModule module = (IRegionModule)mod; - modulename = module.Name; - shared = module.IsSharedModule; + if (mod is IRegionModule) + { + IRegionModule module = (IRegionModule)mod; + modulename = module.Name; + shared = module.IsSharedModule; + } + else if (mod is IRegionModuleBase) + { + IRegionModuleBase module = (IRegionModuleBase)mod; + modulename = module.Name; + shared = mod is ISharedRegionModule; + } + else throw new Exception("AddCommand module parameter must be IRegionModule or IRegionModuleBase"); } MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback); diff --git a/bin/OpenSim.addin.xml b/bin/OpenSim.addin.xml index ff92555703..da64c631f9 100644 --- a/bin/OpenSim.addin.xml +++ b/bin/OpenSim.addin.xml @@ -5,16 +5,24 @@ + + + + + + + + diff --git a/prebuild.xml b/prebuild.xml index ca1a533eea..29b0861d04 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -635,6 +635,7 @@ + @@ -1204,6 +1205,7 @@ + @@ -1491,6 +1493,33 @@ + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + + +