diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/Scene.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 74502b8..e5f10b8 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -124,7 +124,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
124 | { | 124 | { |
125 | get { return m_modules; } | 125 | get { return m_modules; } |
126 | } | 126 | } |
127 | protected Dictionary<Type, object> ModuleInterfaces = new Dictionary<Type, object>(); | 127 | protected Dictionary<Type, List<object> > ModuleInterfaces = new Dictionary<Type, List<object> >(); |
128 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); | 128 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); |
129 | protected Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>(); | 129 | protected Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>(); |
130 | 130 | ||
@@ -3025,10 +3025,27 @@ namespace OpenSim.Region.Environment.Scenes | |||
3025 | { | 3025 | { |
3026 | if (!ModuleInterfaces.ContainsKey(typeof(M))) | 3026 | if (!ModuleInterfaces.ContainsKey(typeof(M))) |
3027 | { | 3027 | { |
3028 | ModuleInterfaces.Add(typeof(M), mod); | 3028 | List<Object> l = new List<Object>(); |
3029 | l.Add(mod); | ||
3030 | ModuleInterfaces.Add(typeof(M), l); | ||
3029 | } | 3031 | } |
3030 | } | 3032 | } |
3031 | 3033 | ||
3034 | public void StackModuleInterface<M>(M mod) | ||
3035 | { | ||
3036 | List<Object> l; | ||
3037 | if (ModuleInterfaces.ContainsKey(typeof(M))) | ||
3038 | l = ModuleInterfaces[typeof(M)]; | ||
3039 | else | ||
3040 | l = new List<Object>(); | ||
3041 | |||
3042 | if (l.Contains(mod)) | ||
3043 | return; | ||
3044 | |||
3045 | l.Add(mod); | ||
3046 | ModuleInterfaces[typeof(M)] = l; | ||
3047 | } | ||
3048 | |||
3032 | /// <summary> | 3049 | /// <summary> |
3033 | /// For the given interface, retrieve the region module which implements it. | 3050 | /// For the given interface, retrieve the region module which implements it. |
3034 | /// </summary> | 3051 | /// </summary> |
@@ -3037,7 +3054,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
3037 | { | 3054 | { |
3038 | if (ModuleInterfaces.ContainsKey(typeof(T))) | 3055 | if (ModuleInterfaces.ContainsKey(typeof(T))) |
3039 | { | 3056 | { |
3040 | return (T)ModuleInterfaces[typeof(T)]; | 3057 | return (T)ModuleInterfaces[typeof(T)][0]; |
3041 | } | 3058 | } |
3042 | else | 3059 | else |
3043 | { | 3060 | { |
@@ -3045,6 +3062,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
3045 | } | 3062 | } |
3046 | } | 3063 | } |
3047 | 3064 | ||
3065 | public override T[] RequestModuleInterfaces<T>() | ||
3066 | { | ||
3067 | if (ModuleInterfaces.ContainsKey(typeof(T))) | ||
3068 | { | ||
3069 | List<T> ret = new List<T>(); | ||
3070 | |||
3071 | foreach(Object o in ModuleInterfaces[typeof(T)]) | ||
3072 | ret.Add((T)o); | ||
3073 | return ret.ToArray(); | ||
3074 | } | ||
3075 | else | ||
3076 | { | ||
3077 | return new T[] { default(T) }; | ||
3078 | } | ||
3079 | } | ||
3080 | |||
3048 | public void SetObjectCapacity(int objects) | 3081 | public void SetObjectCapacity(int objects) |
3049 | { | 3082 | { |
3050 | if (m_statsReporter != null) | 3083 | if (m_statsReporter != null) |
@@ -3628,7 +3661,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
3628 | m_eventManager.TriggerNotAtTargetEvent(localID); | 3661 | m_eventManager.TriggerNotAtTargetEvent(localID); |
3629 | } | 3662 | } |
3630 | 3663 | ||
3631 | private bool scriptDanger(SceneObjectPart part,Vector3 pos) | 3664 | private bool ScriptDanger(SceneObjectPart part,Vector3 pos) |
3632 | { | 3665 | { |
3633 | ILandObject parcel = LandChannel.GetLandObject(pos.X, pos.Y); | 3666 | ILandObject parcel = LandChannel.GetLandObject(pos.X, pos.Y); |
3634 | if (part != null) | 3667 | if (part != null) |
@@ -3684,12 +3717,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
3684 | } | 3717 | } |
3685 | } | 3718 | } |
3686 | 3719 | ||
3687 | public bool scriptDanger(uint localID, Vector3 pos) | 3720 | public bool ScriptDanger(uint localID, Vector3 pos) |
3688 | { | 3721 | { |
3689 | SceneObjectPart part = GetSceneObjectPart(localID); | 3722 | SceneObjectPart part = GetSceneObjectPart(localID); |
3690 | if (part != null) | 3723 | if (part != null) |
3691 | { | 3724 | { |
3692 | return scriptDanger(part, pos); | 3725 | return ScriptDanger(part, pos); |
3693 | } | 3726 | } |
3694 | else | 3727 | else |
3695 | { | 3728 | { |
@@ -3697,19 +3730,19 @@ namespace OpenSim.Region.Environment.Scenes | |||
3697 | } | 3730 | } |
3698 | } | 3731 | } |
3699 | 3732 | ||
3700 | public bool pipeEventsForScript(uint localID) | 3733 | public bool PipeEventsForScript(uint localID) |
3701 | { | 3734 | { |
3702 | SceneObjectPart part = GetSceneObjectPart(localID); | 3735 | SceneObjectPart part = GetSceneObjectPart(localID); |
3703 | if (part != null) | 3736 | if (part != null) |
3704 | { | 3737 | { |
3705 | // Changed so that child prims of attachments return scriptDanger for their parent, so that | 3738 | // Changed so that child prims of attachments return ScriptDanger for their parent, so that |
3706 | // their scripts will actually run. | 3739 | // their scripts will actually run. |
3707 | // -- Leaf, Tue Aug 12 14:17:05 EDT 2008 | 3740 | // -- Leaf, Tue Aug 12 14:17:05 EDT 2008 |
3708 | SceneObjectPart parent = part.ParentGroup.RootPart; | 3741 | SceneObjectPart parent = part.ParentGroup.RootPart; |
3709 | if (parent != null && parent.IsAttachment) | 3742 | if (parent != null && parent.IsAttachment) |
3710 | return scriptDanger(parent, parent.GetWorldPosition()); | 3743 | return ScriptDanger(parent, parent.GetWorldPosition()); |
3711 | else | 3744 | else |
3712 | return scriptDanger(part, part.GetWorldPosition()); | 3745 | return ScriptDanger(part, part.GetWorldPosition()); |
3713 | } | 3746 | } |
3714 | else | 3747 | else |
3715 | { | 3748 | { |