diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObjectAccessor.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObjectAccessor.cs new file mode 100644 index 0000000000..feddf67cd6 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObjectAccessor.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using OpenMetaverse; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + public interface IObjectAccessor : ICollection + { + IObject this[int index] { get; } + IObject this[uint index] { get; } + IObject this[UUID index] { get; } + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs index bfa6b6576d..1b1ce921df 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs @@ -33,7 +33,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { public interface IWorld { - IObject[] Objects { get; } + IObjectAccessor Objects { get; } IAvatar[] Avatars { get; } IHeightmap Terrain { get; } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs new file mode 100644 index 0000000000..ad7182e6fe --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using OpenMetaverse; +using OpenSim.Region.Framework.Scenes; +using IEnumerable=System.Collections.IEnumerable; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + + internal class IObjEnum : IEnumerator + { + private readonly Scene m_scene; + private readonly IEnumerator m_sogEnum; + + public IObjEnum(Scene scene) + { + m_scene = scene; + m_sogEnum = m_scene.Entities.GetAllByType().GetEnumerator(); + } + + public void Dispose() + { + m_sogEnum.Dispose(); + } + + public bool MoveNext() + { + return m_sogEnum.MoveNext(); + } + + public void Reset() + { + m_sogEnum.Reset(); + } + + public IObject Current + { + get + { + return new SOPObject(m_scene, m_sogEnum.Current.LocalId); + } + } + + object IEnumerator.Current + { + get { return Current; } + } + } + + public class ObjectAccessor : IObjectAccessor + { + private readonly Scene m_scene; + + public ObjectAccessor(Scene scene) + { + m_scene = scene; + } + + public IObject this[int index] + { + get + { + return new SOPObject(m_scene, m_scene.Entities[(uint)index].LocalId); + } + } + + public IObject this[uint index] + { + get + { + return new SOPObject(m_scene, m_scene.Entities[index].LocalId); + } + } + + public IObject this[UUID index] + { + get + { + return new SOPObject(m_scene, m_scene.Entities[index].LocalId); + } + } + + public IEnumerator GetEnumerator() + { + return new IObjEnum(m_scene); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(IObject item) + { + throw new NotSupportedException("Collection is read-only. This is an API TODO FIX, creation of objects is presently impossible."); + } + + public void Clear() + { + throw new NotSupportedException("Collection is read-only. TODO FIX."); + } + + public bool Contains(IObject item) + { + return m_scene.Entities.ContainsKey(item.LocalID); + } + + public void CopyTo(IObject[] array, int arrayIndex) + { + for (int i = arrayIndex; i < Count + arrayIndex; i++) + { + array[i] = this[i - arrayIndex]; + } + } + + public bool Remove(IObject item) + { + throw new NotSupportedException("Collection is read-only. TODO FIX."); + } + + public int Count + { + get { return m_scene.Entities.Count; } + } + + public bool IsReadOnly + { + get { return true; } + } + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index 4ba6778931..987868a6fc 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -35,27 +35,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule private readonly Scene m_internalScene; private readonly Heightmap m_heights; + private ObjectAccessor m_objs; + public World(Scene internalScene) { m_internalScene = internalScene; m_heights = new Heightmap(m_internalScene); + m_objs = new ObjectAccessor(m_internalScene); } - public IObject[] Objects + public IObjectAccessor Objects { - get - { - List ents = m_internalScene.Entities.GetAllByType(); - IObject[] rets = new IObject[ents.Count]; - - for (int i = 0; i < ents.Count; i++) - { - EntityBase ent = ents[i]; - rets[i] = new SOPObject(m_internalScene, ent.LocalId); - } - - return rets; - } + get { return m_objs; } } public IAvatar[] Avatars