From b529750548b74ae16c5b2e0f5393e2ef87626d50 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Thu, 9 Apr 2009 11:09:24 +0000 Subject: [PATCH] * Moves Name, GlobalID and WorldPosition into new IEntity interface. * Avatar and Object now inherit from IEntity. * Avatar.Position is now Avatar.WorldPosition to match IObject property. * Implements event World.OnChat += delegate(IWorld sender, ChatEventArgs e); --- .../Scripting/Minimodule/IAvatar.cs | 6 +- .../Scripting/Minimodule/IObject.cs | 18 +---- .../Scripting/Minimodule/IWorld.cs | 12 +++ .../Scripting/Minimodule/SPAvatar.cs | 5 +- .../Scripting/Minimodule/World.cs | 79 +++++++++++++++++++ 5 files changed, 98 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IAvatar.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IAvatar.cs index a500154b2c..fef85dd9e5 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IAvatar.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IAvatar.cs @@ -32,10 +32,8 @@ using OpenMetaverse; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { - public interface IAvatar + public interface IAvatar : IEntity { - string Name { get; } - UUID GlobalID { get; } - Vector3 Position { get; } + } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs index fd62328f0c..dc2e3fa290 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs @@ -48,7 +48,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule public delegate void OnTouchDelegate(IObject sender, TouchEventArgs e); - public interface IObject + public interface IObject : IEntity { #region Events @@ -91,17 +91,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule /// uint LocalID { get; } - /// - /// The global 'world-unique' ID for this object. - /// (Note, may not actually be world unique) - /// - UUID GlobalID { get; } - - /// - /// The name of this Object. - /// - String Name { get; set; } - /// /// The description assigned to this object. /// @@ -140,11 +129,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule /// Quaternion OffsetRotation { get; set; } - /// - /// The position of the object relative to the Scene - /// - Vector3 WorldPosition { get; set; } - /// /// The position of the object relative to a parent object /// If root, works the same as WorldPosition diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs index b35b57d5a4..e7d902482f 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs @@ -25,13 +25,25 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; + namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { + public class ChatEventArgs : EventArgs + { + public string Text; + public IEntity Sender; + } + + public delegate void OnChatDelegate(IWorld sender, ChatEventArgs e); + public interface IWorld { IObjectAccessor Objects { get; } IAvatar[] Avatars { get; } IParcel[] Parcels { get; } IHeightmap Terrain { get; } + + event OnChatDelegate OnChat; } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs index 25b547cb01..41074c3f10 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using OpenMetaverse; using OpenSim.Region.Framework.Scenes; @@ -49,6 +50,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule public string Name { get { return GetSP().Name; } + set { throw new InvalidOperationException("Avatar Names are a read-only property."); } } public UUID GlobalID @@ -56,9 +58,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule get { return m_ID; } } - public Vector3 Position + public Vector3 WorldPosition { get { return GetSP().AbsolutePosition; } + set { GetSP().AbsolutePosition = value; } } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index 05a6a84e28..e3553bf3d4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -26,6 +26,7 @@ */ using System.Collections.Generic; +using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -45,6 +46,84 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule m_objs = new ObjectAccessor(m_internalScene); } + #region Events + + #region OnChat + private event OnChatDelegate _OnChat; + private bool _OnChatActive; + + public event OnChatDelegate OnChat + { + add + { + if (!_OnChatActive) + { + _OnChatActive = true; + m_internalScene.EventManager.OnChatFromClient += EventManager_OnChatFromClient; + m_internalScene.EventManager.OnChatFromWorld += EventManager_OnChatFromWorld; + } + + _OnChat += value; + } + remove + { + _OnChat -= value; + + if (_OnChat == null) + { + _OnChatActive = false; + m_internalScene.EventManager.OnChatFromClient -= EventManager_OnChatFromClient; + m_internalScene.EventManager.OnChatFromWorld -= EventManager_OnChatFromWorld; + } + } + } + + void EventManager_OnChatFromWorld(object sender, OpenSim.Framework.OSChatMessage chat) + { + if (_OnChat != null) + { + HandleChatPacket(chat); + return; + } + } + + private void HandleChatPacket(OSChatMessage chat) + { + // Object? + if (chat.Sender == null && chat.SenderObject != null) + { + ChatEventArgs e = new ChatEventArgs(); + e.Sender = new SOPObject(m_internalScene, ((SceneObjectPart) chat.SenderObject).LocalId); + e.Text = chat.Message; + + _OnChat(this, e); + return; + } + // Avatar? + if (chat.SenderObject != null && chat.SenderObject == null) + { + ChatEventArgs e = new ChatEventArgs(); + e.Sender = new SPAvatar(m_internalScene, chat.SenderUUID); + e.Text = chat.Message; + + _OnChat(this, e); + return; + } + // Skip if other + } + + void EventManager_OnChatFromClient(object sender, OpenSim.Framework.OSChatMessage chat) + { + if (_OnChat != null) + { + HandleChatPacket(chat); + return; + } + } + #endregion + + #endregion + public IObjectAccessor Objects { get { return m_objs; }