- 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...0.6.5-rc1
parent
50aa775ea7
commit
648452dd91
|
@ -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<Type> m_nonSharedModules = new List<Type>();
|
||||||
|
private List<Type> m_sharedModules = new List<Type>();
|
||||||
|
|
||||||
|
private List<ISharedRegionModule> m_sharedInstances = new List<ISharedRegionModule>();
|
||||||
|
|
||||||
|
#region IApplicationPlugin implementation
|
||||||
|
|
||||||
|
public void Initialise (OpenSimBase openSim)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[REGIONMODULES]: Initializing...");
|
||||||
|
m_openSim = openSim;
|
||||||
|
openSim.ApplicationRegistry.RegisterInterface<IRegionModulesController>(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
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<Addin id="OpenSim.ApplicationPlugins.RegionModulesController" version="0.1">
|
||||||
|
<Runtime>
|
||||||
|
<Import assembly="OpenSim.ApplicationPlugins.RegionModulesController.dll"/>
|
||||||
|
</Runtime>
|
||||||
|
|
||||||
|
<Dependencies>
|
||||||
|
<Addin id="OpenSim" version="0.5" />
|
||||||
|
</Dependencies>
|
||||||
|
|
||||||
|
<Extension path = "/OpenSim/Startup">
|
||||||
|
<Plugin id="RegionModulesController" type="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin" />
|
||||||
|
</Extension>
|
||||||
|
</Addin>
|
|
@ -517,7 +517,7 @@ namespace OpenSim
|
||||||
IClientNetworkServer clientServer;
|
IClientNetworkServer clientServer;
|
||||||
Scene scene = SetupScene(regionInfo, proxyOffset, m_config.Source, out 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<IRegionModule> modules = m_moduleLoader.PickupModules(scene, ".");
|
List<IRegionModule> modules = m_moduleLoader.PickupModules(scene, ".");
|
||||||
|
|
||||||
|
@ -525,6 +525,15 @@ namespace OpenSim
|
||||||
// script module can pick up events exposed by a module
|
// script module can pick up events exposed by a module
|
||||||
m_moduleLoader.InitialiseSharedModules(scene);
|
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();
|
scene.SetModuleInterfaces();
|
||||||
|
|
||||||
// Prims have to be loaded after module configuration since some modules may be invoked during the load
|
// 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();
|
module.PostInitialise();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
scene.EventManager.OnShutdown += delegate() { ShutdownRegion(scene); };
|
||||||
|
|
||||||
mscene = scene;
|
mscene = scene;
|
||||||
return clientServer;
|
return clientServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ShutdownRegion(Scene scene)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[SHUTDOWN]: Shutting down region {0}", scene.RegionInfo.RegionName);
|
||||||
|
IRegionModulesController controller;
|
||||||
|
if (ApplicationRegistry.TryGet<IRegionModulesController>(out controller))
|
||||||
|
{
|
||||||
|
controller.RemoveRegionFromModules(scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene, bool cleanup)
|
public void RemoveRegion(Scene scene, bool cleanup)
|
||||||
{
|
{
|
||||||
// only need to check this if we are not at the
|
// only need to check this if we are not at the
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<Addin id="OpenSim.Region.CoreModules" version="0.2">
|
||||||
|
<Runtime>
|
||||||
|
<Import assembly="OpenSim.Region.CoreModules.dll"/>
|
||||||
|
</Runtime>
|
||||||
|
|
||||||
|
<Dependencies>
|
||||||
|
<Addin id="OpenSim" version="0.5" />
|
||||||
|
</Dependencies>
|
||||||
|
|
||||||
|
<Extension path = "/OpenSim/RegionModules">
|
||||||
|
<RegionModule id="WorldMapModule" type="OpenSim.Region.CoreModules.World.WorldMap.NewWorldMapModule" />
|
||||||
|
<RegionModule id="CommsModule" type="OpenSim.Region.CoreModules.Communications.Local.NewLocalInterregionComms" />
|
||||||
|
</Extension>
|
||||||
|
|
||||||
|
<Extension path = "/OpenSim/WindModule">
|
||||||
|
<WindModel id="ConfigurableWind" type="OpenSim.Region.CoreModules.World.Wind.Plugins.ConfigurableWind" />
|
||||||
|
<WindModel id="SimpleRandomWind" type="OpenSim.Region.CoreModules.World.Wind.Plugins.SimpleRandomWind" />
|
||||||
|
</Extension>
|
||||||
|
|
||||||
|
</Addin>
|
|
@ -1,12 +0,0 @@
|
||||||
<Addin id="WindModule.Default.WindModels" version="1.0">
|
|
||||||
<Runtime>
|
|
||||||
<Import assembly="OpenSim.Region.CoreModules.dll"/>
|
|
||||||
</Runtime>
|
|
||||||
<Dependencies>
|
|
||||||
<Addin id="OpenSim" version="0.5" />
|
|
||||||
</Dependencies>
|
|
||||||
<Extension path = "/OpenSim/WindModule">
|
|
||||||
<WindModel id="ConfigurableWind" type="OpenSim.Region.CoreModules.World.Wind.Plugins.ConfigurableWind" />
|
|
||||||
<WindModel id="SimpleRandomWind" type="OpenSim.Region.CoreModules.World.Wind.Plugins.SimpleRandomWind" />
|
|
||||||
</Extension>
|
|
||||||
</Addin>
|
|
|
@ -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
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <value>
|
||||||
|
/// The name of the module
|
||||||
|
/// </value>
|
||||||
|
string Name { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">
|
||||||
|
/// A <see cref="IConfigSource"/>
|
||||||
|
/// </param>
|
||||||
|
void Initialise(IConfigSource source);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is the inverse to <see cref="Initialise"/>. After a Close(), this instance won't be usable anymore.
|
||||||
|
/// </summary>
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is called whenever a <see cref="Scene"/> is added. For shared modules, this can happen several times.
|
||||||
|
/// For non-shared modules, this happens exactly once, after <see cref="Initialise"/> has been called.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scene">
|
||||||
|
/// A <see cref="Scene"/>
|
||||||
|
/// </param>
|
||||||
|
void AddRegion(Scene scene);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is called whenever a <see cref="Scene"/> 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.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scene">
|
||||||
|
/// A <see cref="Scene"/>
|
||||||
|
/// </param>
|
||||||
|
void RemoveRegion(Scene scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This is called exactly once after all the shared region-modules have been instanciated and
|
||||||
|
/// <see cref="IRegionModuleBase.Initialise"/>d.
|
||||||
|
/// </summary>
|
||||||
|
void PostInitialise();
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,6 +59,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
protected Dictionary<string, IRegionModule> m_modules = new Dictionary<string, IRegionModule>();
|
protected Dictionary<string, IRegionModule> m_modules = new Dictionary<string, IRegionModule>();
|
||||||
|
|
||||||
|
public Dictionary<string, IRegionModuleBase> RegionModules
|
||||||
|
{
|
||||||
|
get { return m_regionModules; }
|
||||||
|
}
|
||||||
|
private Dictionary<string, IRegionModuleBase> m_regionModules = new Dictionary<string, IRegionModuleBase>();
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// The module interfaces available from this scene.
|
/// The module interfaces available from this scene.
|
||||||
/// </value>
|
/// </value>
|
||||||
|
@ -278,6 +284,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a region-module to this scene. TODO: This will replace AddModule in the future.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="module"></param>
|
||||||
|
public void AddRegionModule(string name, IRegionModuleBase module)
|
||||||
|
{
|
||||||
|
if (!RegionModules.ContainsKey(name))
|
||||||
|
{
|
||||||
|
RegionModules.Add(name, module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveRegionModule(string name)
|
||||||
|
{
|
||||||
|
RegionModules.Remove(name);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Register a module commander.
|
/// Register a module commander.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -368,6 +392,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UnregisterModuleInterface<M>(M mod)
|
||||||
|
{
|
||||||
|
List<Object> 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>(M mod)
|
public void StackModuleInterface<M>(M mod)
|
||||||
{
|
{
|
||||||
List<Object> l;
|
List<Object> l;
|
||||||
|
@ -462,11 +505,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (mod != null)
|
if (mod != null)
|
||||||
{
|
{
|
||||||
if (!(mod is IRegionModule))
|
if (mod is IRegionModule)
|
||||||
throw new Exception("AddCommand module parameter must be IRegionModule");
|
{
|
||||||
IRegionModule module = (IRegionModule)mod;
|
IRegionModule module = (IRegionModule)mod;
|
||||||
modulename = module.Name;
|
modulename = module.Name;
|
||||||
shared = module.IsSharedModule;
|
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);
|
MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback);
|
||||||
|
|
|
@ -5,16 +5,24 @@
|
||||||
<Import assembly="OpenSim.Region.Framework.dll"/>
|
<Import assembly="OpenSim.Region.Framework.dll"/>
|
||||||
<Import assembly="Mono.Addins.dll"/>
|
<Import assembly="Mono.Addins.dll"/>
|
||||||
</Runtime>
|
</Runtime>
|
||||||
|
|
||||||
<ExtensionPoint path="/OpenSim/Startup">
|
<ExtensionPoint path="/OpenSim/Startup">
|
||||||
<ExtensionNode name="Plugin" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.IApplicationPlugin"/>
|
<ExtensionNode name="Plugin" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.IApplicationPlugin"/>
|
||||||
</ExtensionPoint>
|
</ExtensionPoint>
|
||||||
|
|
||||||
<ExtensionPoint path="/OpenSim/AssetCache" name="Region Asset Cache Plugin-point" >
|
<ExtensionPoint path="/OpenSim/AssetCache" name="Region Asset Cache Plugin-point" >
|
||||||
<ExtensionNode name="Cache" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.Framework.IAssetCache"/>
|
<ExtensionNode name="Cache" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.Framework.IAssetCache"/>
|
||||||
</ExtensionPoint>
|
</ExtensionPoint>
|
||||||
|
|
||||||
<ExtensionPoint path="/OpenSim/AssetClient" name="Region Asset Cache Server Interface Plugin-point">
|
<ExtensionPoint path="/OpenSim/AssetClient" name="Region Asset Cache Server Interface Plugin-point">
|
||||||
<ExtensionNode name="AssetClient" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.Framework.IAssetServer"/>
|
<ExtensionNode name="AssetClient" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.Framework.IAssetServer"/>
|
||||||
</ExtensionPoint>
|
</ExtensionPoint>
|
||||||
|
|
||||||
<ExtensionPoint path="/OpenSim/WindModule" name="Wind Module Plugins for wind models">
|
<ExtensionPoint path="/OpenSim/WindModule" name="Wind Module Plugins for wind models">
|
||||||
<ExtensionNode name="WindModel" type="Mono.Addins.TypeExtensionNode" objectType="OpenSim.Region.Framework.Interfaces.IWindModelPlugin"/>
|
<ExtensionNode name="WindModel" type="Mono.Addins.TypeExtensionNode" objectType="OpenSim.Region.Framework.Interfaces.IWindModelPlugin"/>
|
||||||
</ExtensionPoint>
|
</ExtensionPoint>
|
||||||
|
|
||||||
|
<ExtensionPoint path="/OpenSim/RegionModules">
|
||||||
|
<ExtensionNode name="RegionModule" type="Mono.Addins.TypeExtensionNode" objectType="OpenSim.Region.Framework.Interfaces.IRegionModuleBase"/>
|
||||||
|
</ExtensionPoint>
|
||||||
</Addin>
|
</Addin>
|
||||||
|
|
29
prebuild.xml
29
prebuild.xml
|
@ -635,6 +635,7 @@
|
||||||
<Reference name="Nini.dll" />
|
<Reference name="Nini.dll" />
|
||||||
<Reference name="log4net.dll"/>
|
<Reference name="log4net.dll"/>
|
||||||
<Reference name="DotNetOpenMail.dll"/>
|
<Reference name="DotNetOpenMail.dll"/>
|
||||||
|
<Reference name="Mono.Addins.dll"/>
|
||||||
|
|
||||||
<Files>
|
<Files>
|
||||||
<Match pattern="*.cs" recurse="true">
|
<Match pattern="*.cs" recurse="true">
|
||||||
|
@ -1204,6 +1205,7 @@
|
||||||
<Exclude name="Tests" pattern="Tests" />
|
<Exclude name="Tests" pattern="Tests" />
|
||||||
<Exclude name="TerrainDefaultEffects" pattern="World/Terrain/DefaultEffects" />
|
<Exclude name="TerrainDefaultEffects" pattern="World/Terrain/DefaultEffects" />
|
||||||
</Match>
|
</Match>
|
||||||
|
<Match pattern="*.addin.xml" path="Resources" buildAction="EmbeddedResource" recurse="true"/>
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
@ -1491,6 +1493,33 @@
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
<Project name="OpenSim.ApplicationPlugins.RegionModulesController" path="OpenSim/ApplicationPlugins/RegionModulesController" 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="Mono.Addins.dll" />
|
||||||
|
<Reference name="Nini.dll" />
|
||||||
|
<Reference name="OpenSim"/>
|
||||||
|
<Reference name="OpenSim.Region.Framework"/>
|
||||||
|
<Reference name="System"/>
|
||||||
|
<Reference name="System.Xml"/>
|
||||||
|
<Reference name="log4net.dll"/>
|
||||||
|
|
||||||
|
<Files>
|
||||||
|
<Match pattern="*.cs" recurse="true"/>
|
||||||
|
<Match pattern="*.addin.xml" path="Resources" buildAction="EmbeddedResource" recurse="true"/>
|
||||||
|
</Files>
|
||||||
|
</Project>
|
||||||
|
|
||||||
<Project name="OpenSim.ApplicationPlugins.CreateCommsManager" path="OpenSim/ApplicationPlugins/CreateCommsManager" type="Library">
|
<Project name="OpenSim.ApplicationPlugins.CreateCommsManager" path="OpenSim/ApplicationPlugins/CreateCommsManager" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
|
Loading…
Reference in New Issue