diff --git a/OpenMetaverse.GUI/AvatarList.cs b/OpenMetaverse.GUI/AvatarList.cs index c7c89d4b..d71fa6bc 100644 --- a/OpenMetaverse.GUI/AvatarList.cs +++ b/OpenMetaverse.GUI/AvatarList.cs @@ -157,8 +157,8 @@ namespace OpenMetaverse.GUI _Client.Avatars.UUIDNameReply += new EventHandler(Avatars_UUIDNameReply); _Client.Grid.CoarseLocationUpdate += Grid_CoarseLocationUpdate; _Client.Network.OnCurrentSimChanged += new NetworkManager.CurrentSimChangedCallback(Network_OnCurrentSimChanged); - _Client.Objects.OnNewAvatar += new ObjectManager.NewAvatarCallback(Objects_OnNewAvatar); - _Client.Objects.OnObjectUpdated += new ObjectManager.ObjectUpdatedCallback(Objects_OnObjectUpdated); + _Client.Objects.NewAvatar += Objects_OnNewAvatar; + _Client.Objects.ObjectUpdated += Objects_OnObjectUpdated; } void Avatars_UUIDNameReply(object sender, UUIDNameReplyEventArgs e) @@ -446,19 +446,19 @@ namespace OpenMetaverse.GUI ClearItems(); } - void Objects_OnNewAvatar(Simulator simulator, Avatar avatar, ulong regionHandle, ushort timeDilation) + void Objects_OnNewAvatar(object sender, NewAvatarEventArgs e) { - UpdateAvatar(avatar); + UpdateAvatar(e.Avatar); } - void Objects_OnObjectUpdated(Simulator simulator, ObjectUpdate update, ulong regionHandle, ushort timeDilation) + void Objects_OnObjectUpdated(object sender, ObjectUpdatedEventArgs e) { lock (_TrackedAvatars) { - if (_TrackedAvatars.ContainsKey(update.LocalID)) + if (_TrackedAvatars.ContainsKey(e.Update.LocalID)) { Avatar av; - if (simulator.ObjectsAvatars.TryGetValue(update.LocalID, out av)) + if (e.Simulator.ObjectsAvatars.TryGetValue(e.Update.LocalID, out av)) UpdateAvatar(av); } } diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index fbb3a56f..9613705c 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -904,7 +904,7 @@ namespace OpenMetaverse /// public void RequestImage(UUID textureID, ImageType imageType, float priority, int discardLevel, uint packetStart, TextureDownloadCallback callback, bool progress) - { + { Texture.RequestTexture(textureID, imageType, priority, discardLevel, packetStart, callback, progress); } diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index 515a92b8..b2fab6fc 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -1129,6 +1129,23 @@ namespace OpenMetaverse.Messages.Linden } } + + public class WebFetchInventoryDescendentsMessage : IMessage + { + #region IMessage Members + + public OSDMap Serialize() + { + throw new NotImplementedException(); + } + + public void Deserialize(OSDMap map) + { + throw new NotImplementedException(); + } + + #endregion + } #endregion #region Agent Messages diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index d0324c3a..ec79d774 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -85,6 +85,7 @@ namespace OpenMetaverse.Messages case "AgentDropGroup": message = new AgentDropGroupMessage(); break; case "ForceCloseChatterBoxSession": message = new ForceCloseChatterBoxSessionMessage(); break; case "UploadBakedTexture": message = new UploadBakedTextureMessage(); break; + case "WebFetchInventoryDescendents": message = new WebFetchInventoryDescendentsMessage(); break; //case "ProductInfoRequest": message = new ProductInfoRequestMessage(); break; // Capabilities TODO: diff --git a/OpenMetaverse/ObjectManager.cs b/OpenMetaverse/ObjectManager.cs index 6488ae58..d8f45c93 100644 --- a/OpenMetaverse/ObjectManager.cs +++ b/OpenMetaverse/ObjectManager.cs @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2008, openmetaverse.org + * Copyright (c) 2006-2009, openmetaverse.org * All rights reserved. * * - Redistribution and use in source and binary forms, with or without @@ -161,210 +161,297 @@ namespace OpenMetaverse public const float HAVOK_TIMESTEP = 1.0f / 45.0f; #region Delegates + + /// The event subscribers, null of no subscribers + private EventHandler m_NewPrim; - /// - /// - /// - /// - /// - /// - /// - public delegate void NewPrimCallback(Simulator simulator, Primitive prim, ulong regionHandle, - ushort timeDilation); - /// - /// - /// - /// - /// - /// - /// - public delegate void NewAttachmentCallback(Simulator simulator, Primitive prim, ulong regionHandle, - ushort timeDilation); - /// - /// - /// - /// - /// - public delegate void ObjectPropertiesCallback(Simulator simulator, Primitive.ObjectProperties props); - /// - /// - /// - /// - /// - /// - public delegate void ObjectPropertiesUpdatedCallback(Simulator simulator, Primitive prim, Primitive.ObjectProperties props); - /// - /// - /// - /// - /// - /// - public delegate void ObjectPropertiesFamilyCallback(Simulator simulator, Primitive.ObjectProperties props, - ReportType type); - /// - /// - /// - /// - /// - /// - /// - public delegate void NewAvatarCallback(Simulator simulator, Avatar avatar, ulong regionHandle, - ushort timeDilation); - /// - /// - /// - /// - /// - /// - /// - public delegate void NewFoliageCallback(Simulator simulator, Primitive foliage, ulong regionHandle, - ushort timeDilation); - /// - /// Called whenever an object terse update is received - /// - /// - /// - /// - /// - public delegate void ObjectUpdatedCallback(Simulator simulator, ObjectUpdate update, ulong regionHandle, - ushort timeDilation); - /// - /// Called whenever an object terse update is received - /// This is different than the above in that the update to the prim has not happened yet - /// - /// - /// - /// - /// - /// - public delegate void ObjectUpdatedTerseCallback(Simulator simulator, Primitive prim, ObjectUpdate update, ulong RegionHandle, ushort TimeDilation); - /// - /// Called whenever an major object update is received - /// This is when major changes are happening to the contructionData changing the shape of an object - /// - /// - /// - /// - /// - /// - /// - public delegate void ObjectDataBlockUpdateCallback(Simulator simulator, Primitive prim, Primitive.ConstructionData constructionData, - ObjectUpdatePacket.ObjectDataBlock block, ObjectUpdate objectupdate, NameValue[] nameValues); - /// - /// Called whenever an object disappears - /// - /// - /// - public delegate void KillObjectCallback(Simulator simulator, uint objectID); - /// - /// Called whenever the client avatar sits down or stands up - /// - /// Simulator the packet was received from - /// - /// The local ID of the object that is being sat - /// - /// on. If this is zero the avatar is not sitting on an object - public delegate void AvatarSitChanged(Simulator simulator, Avatar avatar, uint sittingOn, uint oldSeat); + ///Raises the NewPrim Event + /// A NewPrimEventArgs object containing + /// the data sent from the simulator + protected virtual void OnNewPrim(PrimEventArgs e) + { + EventHandler handler = m_NewPrim; + if (handler != null) + handler(this, e); + } - /// - /// Called when we get PayPriceReply packet after calling RequestPayPrice - /// - /// Simulator the packet was received from - /// Object - /// Default pay price for the object, -1 means control should be disabled, -2 it should be empty - /// Array of 4 prices, -1 means button should be disabled - public delegate void PayPriceReply(Simulator simulator, UUID objectID, int defaultPrice, int[] buttonPrices); + /// Thread sync lock object + private readonly object m_NewPrimLock = new object(); + + /// Raised when the simulator sends us data containing + /// A new Primitive, or Foliage + public event EventHandler NewPrim + { + add { lock (m_NewPrimLock) { m_NewPrim += value; } } + remove { lock (m_NewPrimLock) { m_NewPrim -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_NewAttachment; + + ///Raises the NewAttachment Event + /// A NewAttachmentEventArgs object containing + /// the data sent from the simulator + protected virtual void OnNewAttachment(PrimEventArgs e) + { + EventHandler handler = m_NewAttachment; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_NewAttachmentLock = new object(); + + /// Raised when the simulator sends us data containing + /// a new primitive that is an Attachment + public event EventHandler NewAttachment + { + add { lock (m_NewAttachmentLock) { m_NewAttachment += value; } } + remove { lock (m_NewAttachmentLock) { m_NewAttachment -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectProperties; + + ///Raises the ObjectProperties Event + /// A ObjectPropertiesEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectProperties(ObjectPropertiesEventArgs e) + { + EventHandler handler = m_ObjectProperties; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectPropertiesLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectProperties + { + add { lock (m_ObjectPropertiesLock) { m_ObjectProperties += value; } } + remove { lock (m_ObjectPropertiesLock) { m_ObjectProperties -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectPropertiesUpdated; + + ///Raises the ObjectPropertiesUpdated Event + /// A ObjectPropertiesUpdatedEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectPropertiesUpdated(ObjectPropertiesUpdatedEventArgs e) + { + EventHandler handler = m_ObjectPropertiesUpdated; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectPropertiesUpdatedLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectPropertiesUpdated + { + add { lock (m_ObjectPropertiesUpdatedLock) { m_ObjectPropertiesUpdated += value; } } + remove { lock (m_ObjectPropertiesUpdatedLock) { m_ObjectPropertiesUpdated -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectPropertiesFamily; + + ///Raises the ObjectPropertiesFamily Event + /// A ObjectPropertiesFamilyEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectPropertiesFamily(ObjectPropertiesFamilyEventArgs e) + { + EventHandler handler = m_ObjectPropertiesFamily; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectPropertiesFamilyLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectPropertiesFamily + { + add { lock (m_ObjectPropertiesFamilyLock) { m_ObjectPropertiesFamily += value; } } + remove { lock (m_ObjectPropertiesFamilyLock) { m_ObjectPropertiesFamily -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_NewAvatar; + + ///Raises the NewAvatar Event + /// A NewAvatarEventArgs object containing + /// the data sent from the simulator + protected virtual void OnNewAvatar(NewAvatarEventArgs e) + { + EventHandler handler = m_NewAvatar; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_NewAvatarLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler NewAvatar + { + add { lock (m_NewAvatarLock) { m_NewAvatar += value; } } + remove { lock (m_NewAvatarLock) { m_NewAvatar -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectUpdated; + + ///Raises the ObjectUpdated Event + /// A ObjectUpdatedEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectUpdated(ObjectUpdatedEventArgs e) + { + EventHandler handler = m_ObjectUpdated; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectUpdatedLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectUpdated + { + add { lock (m_ObjectUpdatedLock) { m_ObjectUpdated += value; } } + remove { lock (m_ObjectUpdatedLock) { m_ObjectUpdated -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectUpdatedTerse; + + ///Raises the ObjectUpdatedTerse Event + /// A ObjectUpdatedTerseEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectUpdatedTerse(ObjectUpdatedTerseEventArgs e) + { + EventHandler handler = m_ObjectUpdatedTerse; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectUpdatedTerseLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectUpdatedTerse + { + add { lock (m_ObjectUpdatedTerseLock) { m_ObjectUpdatedTerse += value; } } + remove { lock (m_ObjectUpdatedTerseLock) { m_ObjectUpdatedTerse -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_ObjectDataBlockUpdate; + + ///Raises the ObjectDataBlockUpdate Event + /// A ObjectDataBlockUpdateEventArgs object containing + /// the data sent from the simulator + protected virtual void OnObjectDataBlockUpdate(ObjectDataBlockUpdateEventArgs e) + { + EventHandler handler = m_ObjectDataBlockUpdate; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ObjectDataBlockUpdateLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler ObjectDataBlockUpdate + { + add { lock (m_ObjectDataBlockUpdateLock) { m_ObjectDataBlockUpdate += value; } } + remove { lock (m_ObjectDataBlockUpdateLock) { m_ObjectDataBlockUpdate -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_KillObject; + + ///Raises the KillObject Event + /// A KillObjectEventArgs object containing + /// the data sent from the simulator + protected virtual void OnKillObject(KillObjectEventArgs e) + { + EventHandler handler = m_KillObject; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_KillObjectLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler KillObject + { + add { lock (m_KillObjectLock) { m_KillObject += value; } } + remove { lock (m_KillObjectLock) { m_KillObject -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_AvatarSitChanged; + + ///Raises the AvatarSitChanged Event + /// A AvatarSitChangedEventArgs object containing + /// the data sent from the simulator + protected virtual void OnAvatarSitChanged(AvatarSitChangedEventArgs e) + { + EventHandler handler = m_AvatarSitChanged; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_AvatarSitChangedLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler AvatarSitChanged + { + add { lock (m_AvatarSitChangedLock) { m_AvatarSitChanged += value; } } + remove { lock (m_AvatarSitChangedLock) { m_AvatarSitChanged -= value; } } + } + + /// The event subscribers, null of no subscribers + private EventHandler m_PayPriceReply; + + ///Raises the PayPriceReply Event + /// A PayPriceReplyEventArgs object containing + /// the data sent from the simulator + protected virtual void OnPayPriceReply(PayPriceReplyEventArgs e) + { + EventHandler handler = m_PayPriceReply; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_PayPriceReplyLock = new object(); + + /// Raised when the simulator sends us data containing + /// ... + public event EventHandler PayPriceReply + { + add { lock (m_PayPriceReplyLock) { m_PayPriceReply += value; } } + remove { lock (m_PayPriceReplyLock) { m_PayPriceReply -= value; } } + } #endregion Delegates - #region Events - - /// - /// This event will be raised for every ObjectUpdate block that - /// contains a prim that isn't attached to an avatar. - /// - /// Depending on the circumstances a client could - /// receive two or more of these events for the same object, if you - /// or the object left the current sim and returned for example. Client - /// applications are responsible for tracking and storing objects. - /// - public event NewPrimCallback OnNewPrim; - /// - /// This event will be raised for every ObjectUpdate block that - /// contains an avatar attachment. - /// - /// Depending on the circumstances a client could - /// receive two or more of these events for the same object, if you - /// or the object left the current sim and returned for example. Client - /// applications are responsible for tracking and storing objects. - /// - public event NewAttachmentCallback OnNewAttachment; - /// - /// This event will be raised for every ObjectUpdate block that - /// contains a new avatar. - /// - /// Depending on the circumstances a client - /// could receive two or more of these events for the same avatar, if - /// you or the other avatar left the current sim and returned for - /// example. Client applications are responsible for tracking and - /// storing objects. - /// - public event NewAvatarCallback OnNewAvatar; - /// - /// This event will be raised when a terse object update packet is - /// received, containing the updated position, rotation, and - /// movement-related vectors - /// - public event ObjectUpdatedTerseCallback OnObjectTerseUpdate; - /// - /// This event will be raised when a terse object update packet is - /// received, containing the updated position, rotation, and - /// movement-related vectors - /// - public event ObjectUpdatedCallback OnObjectUpdated; - #region OnOnObjectDataBlockUpdate - - /// - /// Triggers the OnObjectDataBlockUpdate event. - /// - public event ObjectDataBlockUpdateCallback OnObjectDataBlockUpdate; - #endregion - - /// - /// This event will be raised when an avatar sits on an object - /// or stands up, with a local ID of the current seat or zero. - /// - public event AvatarSitChanged OnAvatarSitChanged; - /// - /// This event will be raised when an object is removed from a - /// simulator. - /// - public event KillObjectCallback OnObjectKilled; - /// - /// This event will be raised when an objects properties are received - /// from the simulator - /// - public event ObjectPropertiesCallback OnObjectProperties; - /// - /// This event will be raised when an objects properties are updated - /// from the simulator - /// - public event ObjectPropertiesUpdatedCallback OnObjectPropertiesUpdated; - /// - /// Thie event will be raised when an objects properties family - /// information is recieved from the simulator. ObjectPropertiesFamily - /// is a subset of the fields found in ObjectProperties - /// - public event ObjectPropertiesFamilyCallback OnObjectPropertiesFamily; - - /// - /// This event will be fired when we recieve pay price information - /// for the object after having asked for them with RequestPayPrice - /// - public event PayPriceReply OnPayPriceReply; - - #endregion - /// Reference to the GridClient object protected GridClient Client; /// Does periodic dead reckoning calculation to convert @@ -375,32 +462,20 @@ namespace OpenMetaverse /// Instantiates a new ObjectManager class /// /// A reference to the client - internal ObjectManager(GridClient client) + public ObjectManager(GridClient client) { Client = client; - RegisterCallbacks(); + Client.Network.RegisterCallback(PacketType.ObjectUpdate, ObjectUpdateHandler); + Client.Network.RegisterCallback(PacketType.ImprovedTerseObjectUpdate, ImprovedTerseObjectUpdateHandler); + Client.Network.RegisterCallback(PacketType.ObjectUpdateCompressed, ObjectUpdateCompressedHandler); + Client.Network.RegisterCallback(PacketType.ObjectUpdateCached, ObjectUpdateCachedHandler); + Client.Network.RegisterCallback(PacketType.KillObject, KillObjectHandler); + Client.Network.RegisterCallback(PacketType.ObjectPropertiesFamily, ObjectPropertiesFamilyHandler); + Client.Network.RegisterCallback(PacketType.ObjectProperties, ObjectPropertiesHandler); + Client.Network.RegisterCallback(PacketType.PayPriceReply, PayPriceReplyHandler); } - - /// - /// Instantiates a new ObjectManager class - /// - /// A reference to the client - /// If false, the ObjectManager won't - /// register any packet callbacks and won't decode incoming object - /// packets - protected ObjectManager(GridClient client, bool registerCallbacks) - { - Client = client; - Client.Network.OnConnected += new NetworkManager.ConnectedCallback(Network_OnConnected); - Client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(Network_OnDisconnected); - - if (registerCallbacks) - { - RegisterCallbacks(); - } - } - - void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message) + + private void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message) { if (InterpolationTimer != null) { @@ -409,7 +484,7 @@ namespace OpenMetaverse } } - void Network_OnConnected(object sender) + private void Network_OnConnected(object sender) { if (Client.Settings.USE_INTERPOLATION_TIMER) { @@ -417,18 +492,6 @@ namespace OpenMetaverse } } - protected void RegisterCallbacks() - { - Client.Network.RegisterCallback(PacketType.ObjectUpdate, UpdateHandler); - Client.Network.RegisterCallback(PacketType.ImprovedTerseObjectUpdate, TerseUpdateHandler); - Client.Network.RegisterCallback(PacketType.ObjectUpdateCompressed, CompressedUpdateHandler); - Client.Network.RegisterCallback(PacketType.ObjectUpdateCached, CachedUpdateHandler); - Client.Network.RegisterCallback(PacketType.KillObject, KillObjectHandler); - Client.Network.RegisterCallback(PacketType.ObjectPropertiesFamily, ObjectPropertiesFamilyHandler); - Client.Network.RegisterCallback(PacketType.ObjectProperties, ObjectPropertiesHandler); - Client.Network.RegisterCallback(PacketType.PayPriceReply, PayPriceReplyHandler); - } - #region Action Methods /// @@ -1516,7 +1579,7 @@ namespace OpenMetaverse /// /// /// - protected void UpdateHandler(Packet packet, Simulator simulator) + protected void ObjectUpdateHandler(Packet packet, Simulator simulator) { ObjectUpdatePacket update = (ObjectUpdatePacket)packet; UpdateDilation(simulator, update.RegionData.TimeDilation); @@ -1547,11 +1610,11 @@ namespace OpenMetaverse case PCode.Tree: case PCode.NewTree: case PCode.Prim: - if (OnNewPrim == null) continue; + if (m_NewPrim == null) continue; break; case PCode.Avatar: // Make an exception for updates about our own agent - if (block.FullID != Client.Self.AgentID && OnNewAvatar == null) continue; + if (block.FullID != Client.Self.AgentID && m_NewAvatar == null) continue; break; case PCode.ParticleSystem: continue; // TODO: Do something with these @@ -1737,7 +1800,8 @@ namespace OpenMetaverse // Textures objectupdate.Textures = new Primitive.TextureEntry(block.TextureEntry, 0, block.TextureEntry.Length); - FireOnObjectDataBlockUpdate(simulator, prim, data , block , objectupdate, nameValues); + + OnObjectDataBlockUpdate(new ObjectDataBlockUpdateEventArgs(simulator, prim, data, block, objectupdate, nameValues)); #region Update Prim Info with decoded data prim.Flags = (PrimFlags)block.UpdateFlags; @@ -1817,11 +1881,12 @@ namespace OpenMetaverse #endregion if (attachment) - FireOnNewAttachment(simulator, prim, update.RegionData.RegionHandle, - update.RegionData.TimeDilation); + OnNewAttachment(new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation)); else - FireOnNewPrim(simulator, prim, update.RegionData.RegionHandle, - update.RegionData.TimeDilation); + OnNewPrim(new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation)); + + // FireOnNewPrim(simulator, prim, update.RegionData.RegionHandle, + // update.RegionData.TimeDilation); break; #endregion Prim and Foliage @@ -1855,7 +1920,7 @@ namespace OpenMetaverse objectupdate.Textures = new Primitive.TextureEntry(block.TextureEntry, 0, block.TextureEntry.Length); - FireOnObjectDataBlockUpdate(simulator, avatar, data, block, objectupdate, nameValues); + OnObjectDataBlockUpdate(new ObjectDataBlockUpdateEventArgs(simulator, avatar, data, block, objectupdate, nameValues)); uint oldSeatID = avatar.ParentID; @@ -1869,7 +1934,10 @@ namespace OpenMetaverse avatar.AngularVelocity = objectupdate.AngularVelocity; avatar.NameValues = nameValues; avatar.PrimData = data; - if (block.Data.Length > 0) Logger.Log("Unexpected Data field for an avatar update, length " + block.Data.Length, Helpers.LogLevel.Warning); + if (block.Data.Length > 0) + { + Logger.Log("Unexpected Data field for an avatar update, length " + block.Data.Length, Helpers.LogLevel.Warning); + } avatar.ParentID = block.ParentID; avatar.RegionHandle = update.RegionData.RegionHandle; @@ -1880,8 +1948,7 @@ namespace OpenMetaverse #endregion Create an Avatar from the decoded data - FireOnNewAvatar(simulator, avatar, update.RegionData.RegionHandle, - update.RegionData.TimeDilation); + OnNewAvatar(new NewAvatarEventArgs(simulator, avatar, update.RegionData.TimeDilation)); break; #endregion Avatar @@ -1945,7 +2012,7 @@ namespace OpenMetaverse /// /// /// - protected void TerseUpdateHandler(Packet packet, Simulator simulator) + protected void ImprovedTerseObjectUpdateHandler(Packet packet, Simulator simulator) { ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)packet; UpdateDilation(simulator, terse.RegionData.TimeDilation); @@ -1960,8 +2027,13 @@ namespace OpenMetaverse uint localid = Utils.BytesToUInt(block.Data, 0); // Check if we are interested in this update - if (!Client.Settings.ALWAYS_DECODE_OBJECTS && localid != Client.Self.localID && OnObjectUpdated == null && OnObjectTerseUpdate == null) + if (!Client.Settings.ALWAYS_DECODE_OBJECTS + && localid != Client.Self.localID + && m_ObjectUpdated == null + && m_ObjectUpdatedTerse == null) + { continue; + } #region Decode update data @@ -2020,7 +2092,7 @@ namespace OpenMetaverse (Primitive)GetPrimitive(simulator, update.LocalID, UUID.Zero); // Fire the pre-emptive notice (before we stomp the object) - FireOnObjectTerseUpdate(simulator, obj, update, terse.RegionData.RegionHandle, terse.RegionData.TimeDilation); + OnObjectUpdatedTerse(new ObjectUpdatedTerseEventArgs(simulator, obj, update, terse.RegionData.TimeDilation)); #region Update Client.Self if (update.LocalID == Client.Self.localID) @@ -2044,7 +2116,7 @@ namespace OpenMetaverse obj.Textures = update.Textures; // Fire the callback - FireOnObjectUpdated(simulator, update, terse.RegionData.RegionHandle, terse.RegionData.TimeDilation); + OnObjectUpdated(new ObjectUpdatedEventArgs(simulator, update, terse.RegionData.TimeDilation)); } catch (Exception e) { @@ -2058,7 +2130,7 @@ namespace OpenMetaverse /// /// /// - protected void CompressedUpdateHandler(Packet packet, Simulator simulator) + protected void ObjectUpdateCompressedHandler(Packet packet, Simulator simulator) { ObjectUpdateCompressedPacket update = (ObjectUpdateCompressedPacket)packet; @@ -2088,7 +2160,7 @@ namespace OpenMetaverse case PCode.Tree: case PCode.NewTree: case PCode.Prim: - if (OnNewPrim == null) continue; + if (m_NewPrim == null) continue; break; } } @@ -2292,15 +2364,16 @@ namespace OpenMetaverse #endregion - #region Fire Events + #region Raise Events - // Fire the appropriate callback if ((flags & CompressedFlags.HasNameValues) != 0 && prim.ParentID != 0) - FireOnNewAttachment(simulator, prim, update.RegionData.RegionHandle, - update.RegionData.TimeDilation); + { + OnNewAttachment(new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation)); + } else - FireOnNewPrim(simulator, prim, update.RegionData.RegionHandle, - update.RegionData.TimeDilation); + { + OnNewPrim(new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation)); + } #endregion } @@ -2317,7 +2390,7 @@ namespace OpenMetaverse /// /// The packet containing the object data /// The simulator sending the data - protected void CachedUpdateHandler(Packet packet, Simulator simulator) + protected void ObjectUpdateCachedHandler(Packet packet, Simulator simulator) { if (Client.Settings.ALWAYS_REQUEST_OBJECTS) { @@ -2346,7 +2419,10 @@ namespace OpenMetaverse // Notify first, so that handler has a chance to get a // reference from the ObjectTracker to the object being killed for (int i = 0; i < kill.ObjectData.Length; i++) - FireOnObjectKilled(simulator, kill.ObjectData[i].ID); + { + OnKillObject(new KillObjectEventArgs(simulator, kill.ObjectData[i].ID)); + } + lock (simulator.ObjectsPrimitives.Dictionary) { @@ -2367,7 +2443,7 @@ namespace OpenMetaverse { if (prim.Value.ParentID == localID) { - FireOnObjectKilled(simulator, prim.Key); + OnKillObject(new KillObjectEventArgs(simulator, prim.Key)); removePrims.Add(prim.Key); } } @@ -2392,7 +2468,7 @@ namespace OpenMetaverse { if (prim.Value.ParentID == localID) { - FireOnObjectKilled(simulator, prim.Key); + OnKillObject(new KillObjectEventArgs(simulator, prim.Key)); removePrims.Add(prim.Key); rootPrims.Add(prim.Key); } @@ -2402,7 +2478,7 @@ namespace OpenMetaverse { if (rootPrims.Contains(prim.Value.ParentID)) { - FireOnObjectKilled(simulator, prim.Key); + OnKillObject(new KillObjectEventArgs(simulator, prim.Key)); removePrims.Add(prim.Key); } } @@ -2420,9 +2496,9 @@ namespace OpenMetaverse } } - protected void ObjectPropertiesHandler(Packet p, Simulator sim) + protected void ObjectPropertiesHandler(Packet packet, Simulator simulator) { - ObjectPropertiesPacket op = (ObjectPropertiesPacket)p; + ObjectPropertiesPacket op = (ObjectPropertiesPacket)packet; ObjectPropertiesPacket.ObjectDataBlock[] datablocks = op.ObjectData; for (int i = 0; i < datablocks.Length; ++i) @@ -2461,21 +2537,22 @@ namespace OpenMetaverse if (Client.Settings.OBJECT_TRACKING) { - Primitive findPrim = sim.ObjectsPrimitives.Find( + Primitive findPrim = simulator.ObjectsPrimitives.Find( delegate(Primitive prim) { return prim.ID == props.ObjectID; }); if (findPrim != null) { - FireOnObjectPropertiesUpdated(sim,findPrim,props); - lock (sim.ObjectsPrimitives.Dictionary) + OnObjectPropertiesUpdated(new ObjectPropertiesUpdatedEventArgs(simulator, findPrim, props)); + + lock (simulator.ObjectsPrimitives.Dictionary) { - if (sim.ObjectsPrimitives.Dictionary.ContainsKey(findPrim.LocalID)) - sim.ObjectsPrimitives.Dictionary[findPrim.LocalID].Properties = props; + if (simulator.ObjectsPrimitives.Dictionary.ContainsKey(findPrim.LocalID)) + simulator.ObjectsPrimitives.Dictionary[findPrim.LocalID].Properties = props; } } } - FireOnObjectProperties(sim, props); + OnObjectProperties(new ObjectPropertiesEventArgs(simulator, props)); } } @@ -2521,12 +2598,12 @@ namespace OpenMetaverse } } - FireOnObjectPropertiesFamily(sim, props, requestType); + OnObjectPropertiesFamily(new ObjectPropertiesFamilyEventArgs(sim, props, requestType)); } - protected void PayPriceReplyHandler(Packet packet, Simulator sim) + protected void PayPriceReplyHandler(Packet packet, Simulator simulator) { - if (OnPayPriceReply != null) + if (m_PayPriceReply != null) { PayPriceReplyPacket p = (PayPriceReplyPacket)packet; UUID objectID = p.ObjectData.ObjectID; @@ -2538,8 +2615,7 @@ namespace OpenMetaverse buttonPrices[i] = p.ButtonData[i].PayButton; } - try { OnPayPriceReply(sim, objectID, defaultPrice, buttonPrices); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + OnPayPriceReply(new PayPriceReplyEventArgs(simulator, objectID, defaultPrice, buttonPrices)); } } @@ -2647,10 +2723,9 @@ namespace OpenMetaverse av.ParentID = localid; - if (OnAvatarSitChanged != null && oldSeatID != localid) + if (m_AvatarSitChanged != null && oldSeatID != localid) { - try { OnAvatarSitChanged(sim, av, localid, oldSeatID); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + OnAvatarSitChanged(new AvatarSitChangedEventArgs(sim, av, localid, oldSeatID)); } } @@ -2730,102 +2805,7 @@ namespace OpenMetaverse #endregion Utility Functions - - #region Event Notification - - protected void FireOnObjectDataBlockUpdate(Simulator simulator, Primitive primitive, Primitive.ConstructionData data, ObjectUpdatePacket.ObjectDataBlock block, ObjectUpdate objectupdate, NameValue[] nameValue) - { - if (OnObjectDataBlockUpdate != null) - { - try { OnObjectDataBlockUpdate(simulator, primitive, data, block, objectupdate, nameValue); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnObjectProperties(Simulator sim, Primitive.ObjectProperties props) - { - if (OnObjectProperties != null) - { - try { OnObjectProperties(sim, props); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - - protected void FireOnObjectPropertiesUpdated(Simulator sim,Primitive prim, Primitive.ObjectProperties props) - { - if (OnObjectPropertiesUpdated != null) - { - try { OnObjectPropertiesUpdated(sim,prim, props); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnObjectPropertiesFamily(Simulator sim, Primitive.ObjectProperties props, - ReportType type) - { - if (OnObjectPropertiesFamily != null) - { - try { OnObjectPropertiesFamily(sim, props, type); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnObjectKilled(Simulator simulator, uint localid) - { - if (OnObjectKilled != null) - { - try { OnObjectKilled(simulator, localid); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnNewPrim(Simulator simulator, Primitive prim, ulong RegionHandle, ushort TimeDilation) - { - if (OnNewPrim != null) - { - try { OnNewPrim(simulator, prim, RegionHandle, TimeDilation); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnNewAttachment(Simulator simulator, Primitive prim, ulong RegionHandle, ushort TimeDilation) - { - if (OnNewAttachment != null) - { - try { OnNewAttachment(simulator, prim, RegionHandle, TimeDilation); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnNewAvatar(Simulator simulator, Avatar avatar, ulong RegionHandle, ushort TimeDilation) - { - if (OnNewAvatar != null) - { - try { OnNewAvatar(simulator, avatar, RegionHandle, TimeDilation); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnObjectUpdated(Simulator simulator, ObjectUpdate update, ulong RegionHandle, ushort TimeDilation) - { - if (OnObjectUpdated != null) - { - try { OnObjectUpdated(simulator, update, RegionHandle, TimeDilation); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - - protected void FireOnObjectTerseUpdate(Simulator simulator, Primitive prim, ObjectUpdate update, ulong RegionHandle, ushort TimeDilation) - { - if (OnObjectTerseUpdate != null) - { - try { OnObjectTerseUpdate(simulator, prim, update, RegionHandle,TimeDilation); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - #endregion - + #region Object Tracking Link /// @@ -3003,7 +2983,320 @@ namespace OpenMetaverse if (InterpolationTimer != null) { InterpolationTimer.Change(delay, Timeout.Infinite); - } + } + } + } + #region EventArgs classes + + /// Provides data for the and events + /// The event occurs when the simulator sends + /// an containing a Primitive, Foliage data or Attachment data + /// Note 1: The event will not be raised when the object is an Avatar + /// Note 2: It is possible for the or to be + /// raised twice for the same object if for example the primitive moved to a new simulator, then returned to the current simulator or + /// if an Avatar crosses the border into a new simulator and returns to the current simulator + /// + /// + /// The following code example uses the and + /// properties to display new Primitives and Attachments on the window. + /// + /// // Subscribe to the event that gives us new prims and foliage + /// Client.Objects.NewPrim += Objects_NewPrim; + /// + /// // Subscribe to the event that gives us new Attachments worn + /// // by yours or another agent + /// Client.Objects.NewAttachment += Objects_NewAttachment; + /// + /// private void Objects_NewAttachment(object sender, PrimEventArgs e) + /// { + /// Console.WriteLine("New Attachment {0} {1} in {2}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name); + /// } + /// + /// private void Objects_NewPrim(object sender, PrimEventArgs e) + /// { + /// Console.WriteLine("New Attachment {0} {1} in {2}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name); + /// } + /// + /// + /// + /// + /// + public class PrimEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Primitive m_Prim; + private readonly ushort m_TimeDilation; + + /// Get the simulator the object originated from + public Simulator Simulator { get { return m_Simulator; } } + /// Get the primitive details + public Primitive Prim { get { return m_Prim; } } + /// Get the simulator Time Dilation + public ushort TimeDilation { get { return m_TimeDilation; } } + + /// + /// Construct a new instance of the PrimEventArgs class + /// + /// The simulator the object originated from + /// The Primitive + /// The simulator time dilation + public PrimEventArgs(Simulator simulator, Primitive prim, ushort timeDilation) + { + this.m_Simulator = simulator; + this.m_Prim = prim; + this.m_TimeDilation = timeDilation; } } + + + /// Provides additional primitive data for the event + /// The event occurs when the simulator sends + /// an containing additional details for a Primitive, Foliage data or Attachment data + /// The event is also raised when a request is + /// made. + /// + /// + /// The following code example uses the , and + /// + /// properties to display new attachments and send a request for additional properties containing the name of the + /// attachment then display it on the window. + /// + /// // Subscribe to the event that gives us new Attachments worn + /// // by yours or another agent + /// Client.Objects.NewAttachment += Objects_NewAttachment; + /// // Subscribe to the event that provides additional primitive details + /// Client.Objects.ObjectProperties += Objects_ObjectProperties; + /// + /// private void Objects_NewAttachment(object sender, PrimEventArgs e) + /// { + /// Console.WriteLine("New Attachment {0} {1} in {2}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name); + /// // send a request that causes the simulator to send us back the ObjectProperties + /// Client.Objects.SelectObject(e.Simulator, e.Prim.LocalID); + /// + /// } + /// + /// // handle the properties data that arrives + /// private void Objects_ObjectProperties(object sender, ObjectPropertiesEventArgs e) + /// { + /// Console.WriteLine("Primitive Properties: {0} Name is {1}", e.Properties.ObjectID, e.Properties.Name); + /// } + /// + /// + public class ObjectPropertiesEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Primitive.ObjectProperties m_Properties; + + /// Get the simulator the object is located + public Simulator Simulator { get { return m_Simulator; } } + /// Get the primitive properties + public Primitive.ObjectProperties Properties { get { return m_Properties; } } + + /// + /// Construct a new instance of the ObjectPropertiesEventArgs class + /// + /// The simulator the object is located + /// The primitive Properties + public ObjectPropertiesEventArgs(Simulator simulator, Primitive.ObjectProperties props) + { + this.m_Simulator = simulator; + this.m_Properties = props; + } + } + + /// Provides additional primitive data for the event + /// The event occurs when the simulator sends + /// an containing additional details for a Primitive or Foliage data that is currently + /// being tracked in the dictionary + /// The event is also raised when a request is + /// made and is enabled + /// + public class ObjectPropertiesUpdatedEventArgs : EventArgs + { + + private readonly Simulator m_Simulator; + private readonly Primitive m_Prim; + private readonly Primitive.ObjectProperties m_Properties; + + /// Get the simulator the object is located + public Simulator Simulator { get { return m_Simulator; } } + /// Get the primitive details + public Primitive Prim { get { return m_Prim; } } + /// Get the primitive properties + public Primitive.ObjectProperties Properties { get { return m_Properties; } } + + /// + /// Construct a new instance of the ObjectPropertiesUpdatedEvenrArgs class + /// + /// The simulator the object is located + /// The Primitive + /// The primitive Properties + public ObjectPropertiesUpdatedEventArgs(Simulator simulator, Primitive prim, Primitive.ObjectProperties props) + { + this.m_Simulator = simulator; + this.m_Prim = prim; + this.m_Properties = props; + } + } + + public class ObjectPropertiesFamilyEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Primitive.ObjectProperties m_Properties; + private readonly ReportType m_Type; + + public Simulator Simulator { get { return m_Simulator; } } + public Primitive.ObjectProperties Properties { get { return m_Properties; } } + public ReportType Type { get { return m_Type; } } + + public ObjectPropertiesFamilyEventArgs(Simulator simulator, Primitive.ObjectProperties props, ReportType type) + { + this.m_Simulator = simulator; + this.m_Properties = props; + this.m_Type = type; + } + } + + public class NewAvatarEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Avatar m_Avatar; + private readonly ushort m_TimeDilation; + + public Simulator Simulator { get { return m_Simulator; } } + public Avatar Avatar { get { return m_Avatar; } } + public ushort TimeDilation { get { return m_TimeDilation; } } + + public NewAvatarEventArgs(Simulator simulator, Avatar avatar, ushort timeDilation) + { + this.m_Simulator = simulator; + this.m_Avatar = avatar; + this.m_TimeDilation = timeDilation; + } + } + + public class ObjectUpdatedEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly ObjectUpdate m_Update; + private readonly ushort m_TimeDilation; + + public Simulator Simulator { get { return m_Simulator; } } + public ObjectUpdate Update { get { return m_Update; } } + public ushort TimeDilation { get { return m_TimeDilation; } } + + public ObjectUpdatedEventArgs(Simulator simulator, ObjectUpdate update, ushort timeDilation) + { + this.m_Simulator = simulator; + this.m_Update = update; + this.m_TimeDilation = timeDilation; + } + } + + public class ObjectUpdatedTerseEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Primitive m_Prim; + private readonly ObjectUpdate m_Update; + private readonly ushort m_TimeDilation; + + public Simulator Simulator { get { return m_Simulator; } } + public Primitive Prim { get { return m_Prim; } } + public ObjectUpdate Update { get { return m_Update; } } + public ushort TimeDilation { get { return m_TimeDilation; } } + + public ObjectUpdatedTerseEventArgs(Simulator simulator, Primitive prim, ObjectUpdate update, ushort timeDilation) + { + this.m_Simulator = simulator; + this.m_Prim = prim; + this.m_Update = update; + this.m_TimeDilation = timeDilation; + } + } + + public class ObjectDataBlockUpdateEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Primitive m_Prim; + private readonly Primitive.ConstructionData m_ConstructionData; + private readonly ObjectUpdatePacket.ObjectDataBlock m_Block; + private readonly ObjectUpdate m_Update; + private readonly NameValue[] m_NameValues; + + public Simulator Simulator { get { return m_Simulator; } } + public Primitive Prim { get { return m_Prim; } } + public Primitive.ConstructionData ConstructionData { get { return m_ConstructionData; } } + public ObjectUpdatePacket.ObjectDataBlock Block { get { return m_Block; } } + public ObjectUpdate Update { get { return m_Update; } } + public NameValue[] NameValues { get { return m_NameValues; } } + + public ObjectDataBlockUpdateEventArgs(Simulator simulator, Primitive prim, Primitive.ConstructionData constructionData, + ObjectUpdatePacket.ObjectDataBlock block, ObjectUpdate objectupdate, NameValue[] nameValues) + { + this.m_Simulator = simulator; + this.m_Prim = prim; + this.m_ConstructionData = constructionData; + this.m_Block = block; + this.m_Update = objectupdate; + this.m_NameValues = nameValues; + } + } + + public class KillObjectEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly uint m_ObjectLocalID; + + public Simulator Simulator { get { return m_Simulator; } } + public uint ObjectLocalID { get { return m_ObjectLocalID; } } + + public KillObjectEventArgs(Simulator simulator, uint objectID) + { + this.m_Simulator = simulator; + this.m_ObjectLocalID = objectID; + } + } + + public class AvatarSitChangedEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly Avatar m_Avatar; + private readonly uint m_SittingOn; + private readonly uint m_OldSeat; + + public Simulator Simulator { get { return m_Simulator; } } + public Avatar Avatar { get { return m_Avatar; } } + public uint SittingOn { get { return m_SittingOn; } } + public uint OldSeat { get { return m_OldSeat; } } + + public AvatarSitChangedEventArgs(Simulator simulator, Avatar avatar, uint sittingOn, uint oldSeat) + { + this.m_Simulator = simulator; + this.m_Avatar = avatar; + this.m_SittingOn = sittingOn; + this.m_OldSeat = oldSeat; + } + } + + public class PayPriceReplyEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly UUID m_ObjectID; + private readonly int m_DefaultPrice; + private readonly int[] m_ButtonPrices; + + public Simulator Simulator { get { return m_Simulator; } } + public UUID ObjectID { get { return m_ObjectID; } } + public int DefaultPrice { get { return m_DefaultPrice; } } + public int[] ButtonPrices { get { return m_ButtonPrices; } } + + public PayPriceReplyEventArgs(Simulator simulator, UUID objectID, int defaultPrice, int[] buttonPrices) + { + this.m_Simulator = simulator; + this.m_ObjectID = objectID; + this.m_DefaultPrice = defaultPrice; + this.m_ButtonPrices = buttonPrices; + } + } + #endregion } diff --git a/OpenMetaverse/SoundManager.cs b/OpenMetaverse/SoundManager.cs index ebda3206..d7f93afc 100644 --- a/OpenMetaverse/SoundManager.cs +++ b/OpenMetaverse/SoundManager.cs @@ -81,7 +81,7 @@ namespace OpenMetaverse private readonly object m_AttachedSoundGainChangeLock = new object(); /// Raised when the simulator sends us data containing - /// ... + /// ... public event EventHandler AttachedSoundGainChange { add { lock (m_AttachedSoundGainChangeLock) { m_AttachedSoundGainChange += value; } } @@ -91,7 +91,7 @@ namespace OpenMetaverse /// The event subscribers, null of no subscribers private EventHandler m_SoundTrigger; - ///Raises the SoundTrigger Event + ///Raises the SoundTrigger Event /// A SoundTriggerEventArgs object containing /// the data sent from the simulator protected virtual void OnSoundTrigger(SoundTriggerEventArgs e) diff --git a/Programs/GridProxy/GridProxy.cs b/Programs/GridProxy/GridProxy.cs index 3c59b821..eed5124a 100644 --- a/Programs/GridProxy/GridProxy.cs +++ b/Programs/GridProxy/GridProxy.cs @@ -380,7 +380,7 @@ namespace GridProxy OpenMetaverse.Logger.Log("Login Failed", Helpers.LogLevel.Error, e); break; } - catch (ObjectDisposedException e) + catch (ObjectDisposedException) { break; } diff --git a/Programs/PrimWorkshop/frmBrowser.cs b/Programs/PrimWorkshop/frmBrowser.cs index e2c1953f..9e7f946a 100644 --- a/Programs/PrimWorkshop/frmBrowser.cs +++ b/Programs/PrimWorkshop/frmBrowser.cs @@ -160,9 +160,8 @@ namespace PrimWorkshop Client.Network.OnLogin += new NetworkManager.LoginCallback(Network_OnLogin); Client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(Network_OnDisconnected); Client.Network.OnCurrentSimChanged += new NetworkManager.CurrentSimChangedCallback(Network_OnCurrentSimChanged); - Client.Network.OnEventQueueRunning += new NetworkManager.EventQueueRunningCallback(Network_OnEventQueueRunning); - Client.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); - Client.Objects.OnObjectKilled += new ObjectManager.KillObjectCallback(Objects_OnObjectKilled); + Client.Network.OnEventQueueRunning += new NetworkManager.EventQueueRunningCallback(Network_OnEventQueueRunning); + Client.Objects.NewPrim += Objects_OnNewPrim; Client.Terrain.OnLandPatch += new TerrainManager.LandPatchCallback(Terrain_OnLandPatch); Client.Parcels.SimParcelsDownloaded += new EventHandler(Parcels_SimParcelsDownloaded); @@ -191,6 +190,11 @@ namespace PrimWorkshop */ } + void Objects_NewPrim(object sender, PrimEventArgs e) + { + throw new NotImplementedException(); + } + void Parcels_SimParcelsDownloaded(object sender, SimParcelsDownloadedEventArgs e) { TotalPrims = 0; @@ -940,8 +944,9 @@ namespace PrimWorkshop } } - private void Objects_OnNewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) + private void Objects_OnNewPrim(object sender, PrimEventArgs e) { + Primitive prim = e.Prim; if (prim.PrimData.PCode == PCode.Grass || prim.PrimData.PCode == PCode.Tree || prim.PrimData.PCode == PCode.NewTree) { lock (RenderFoliageList) @@ -1005,12 +1010,7 @@ namespace PrimWorkshop lock (RenderPrimList) RenderPrimList[prim.LocalID] = render; } - - private void Objects_OnObjectKilled(Simulator simulator, uint objectID) - { - // - } - + private void Terrain_OnLandPatch(Simulator simulator, int x, int y, int width, float[] data) { if (Client != null && Client.Network.CurrentSim == simulator) diff --git a/Programs/examples/TestClient/Commands/Agent/PlayAnimationCommand.cs b/Programs/examples/TestClient/Commands/Agent/PlayAnimationCommand.cs index 327ccc56..454ed951 100644 --- a/Programs/examples/TestClient/Commands/Agent/PlayAnimationCommand.cs +++ b/Programs/examples/TestClient/Commands/Agent/PlayAnimationCommand.cs @@ -9,20 +9,12 @@ namespace OpenMetaverse.TestClient { public class PlayAnimationCommand : Command { - private Dictionary m_BuiltInAnimations = new Dictionary(); + private Dictionary m_BuiltInAnimations = new Dictionary(Animations.ToDictionary()); public PlayAnimationCommand(TestClient testClient) { Name = "play"; Description = "Attempts to play an animation"; - Category = CommandCategory.Appearance; - - Type t = typeof(Animations); - FieldInfo[] f = t.GetFields(BindingFlags.Public | BindingFlags.Static); - foreach (FieldInfo field in f) - { - m_BuiltInAnimations.Add((UUID)field.GetValue(t), field.Name); - } - Console.WriteLine(f); + Category = CommandCategory.Appearance; } private string Usage() diff --git a/Programs/examples/TestClient/Commands/Movement/FlyToCommand.cs b/Programs/examples/TestClient/Commands/Movement/FlyToCommand.cs index e88c0790..193dfb14 100644 --- a/Programs/examples/TestClient/Commands/Movement/FlyToCommand.cs +++ b/Programs/examples/TestClient/Commands/Movement/FlyToCommand.cs @@ -19,7 +19,7 @@ namespace OpenMetaverse.TestClient.Commands.Movement Description = "Fly the avatar toward the specified position for a maximum of seconds. Usage: FlyTo x y z [seconds]"; Category = CommandCategory.Movement; - client.Objects.OnObjectUpdated += new ObjectManager.ObjectUpdatedCallback(Objects_OnObjectUpdated); + client.Objects.ObjectUpdated += Objects_OnObjectUpdated; } public override string Execute(string[] args, UUID fromAgentID) @@ -54,10 +54,10 @@ namespace OpenMetaverse.TestClient.Commands.Movement return string.Format("flying to {0} in {1} seconds", target.ToString(), duration / 1000); } - private void Objects_OnObjectUpdated(Simulator simulator, ObjectUpdate update, ulong regionHandle, ushort timeDilation) + private void Objects_OnObjectUpdated(object sender, ObjectUpdatedEventArgs e) { if (startTime == 0) return; - if (update.LocalID == Client.Self.LocalID) + if (e.Update.LocalID == Client.Self.LocalID) { XYMovement(); ZMovement(); diff --git a/Programs/examples/TestClient/Commands/Prims/ChangePermsCommand.cs b/Programs/examples/TestClient/Commands/Prims/ChangePermsCommand.cs index 522df047..490e0248 100644 --- a/Programs/examples/TestClient/Commands/Prims/ChangePermsCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/ChangePermsCommand.cs @@ -13,8 +13,8 @@ namespace OpenMetaverse.TestClient private int PermCount; public ChangePermsCommand(TestClient testClient) - { - testClient.Objects.OnObjectProperties += new ObjectManager.ObjectPropertiesCallback(Objects_OnObjectProperties); + { + testClient.Objects.ObjectProperties += new EventHandler(Objects_OnObjectProperties); Name = "changeperms"; Description = "Recursively changes all of the permissions for child and task inventory objects. Usage prim-uuid [copy] [mod] [xfer]"; @@ -152,11 +152,11 @@ namespace OpenMetaverse.TestClient return "Set permissions to " + Perms.ToString() + " on " + localIDs.Count + " objects and " + taskItems + " inventory items"; } - void Objects_OnObjectProperties(Simulator simulator, Primitive.ObjectProperties properties) + void Objects_OnObjectProperties(object sender, ObjectPropertiesEventArgs e) { if (PermsSent) { - if (Objects.ContainsKey(properties.ObjectID)) + if (Objects.ContainsKey(e.Properties.ObjectID)) { // FIXME: Confirm the current operation against properties.Permissions.NextOwnerMask diff --git a/Programs/examples/TestClient/Commands/Prims/ExportCommand.cs b/Programs/examples/TestClient/Commands/Prims/ExportCommand.cs index d51dc74e..e5f3e725 100644 --- a/Programs/examples/TestClient/Commands/Prims/ExportCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/ExportCommand.cs @@ -21,14 +21,15 @@ namespace OpenMetaverse.TestClient public ExportCommand(TestClient testClient) { - testClient.Objects.OnObjectPropertiesFamily += new ObjectManager.ObjectPropertiesFamilyCallback(Objects_OnObjectPropertiesFamily); - testClient.Objects.OnObjectProperties += new ObjectManager.ObjectPropertiesCallback(Objects_OnObjectProperties); + testClient.Objects.ObjectPropertiesFamily += new EventHandler(Objects_OnObjectPropertiesFamily); + + testClient.Objects.ObjectProperties += new EventHandler(Objects_OnObjectProperties); testClient.Avatars.ViewerEffectPointAt += new EventHandler(Avatars_ViewerEffectPointAt); Name = "export"; Description = "Exports an object to an xml file. Usage: export uuid outputfile.xml"; Category = CommandCategory.Objects; - } + } void Avatars_ViewerEffectPointAt(object sender, ViewerEffectPointAtEventArgs e) { @@ -220,20 +221,19 @@ namespace OpenMetaverse.TestClient } } - void Objects_OnObjectPropertiesFamily(Simulator simulator, Primitive.ObjectProperties properties, - ReportType type) + void Objects_OnObjectPropertiesFamily(object sender, ObjectPropertiesFamilyEventArgs e) { Properties = new Primitive.ObjectProperties(); - Properties.SetFamilyProperties(properties); + Properties.SetFamilyProperties(e.Properties); GotPermissions = true; GotPermissionsEvent.Set(); } - void Objects_OnObjectProperties(Simulator simulator, Primitive.ObjectProperties properties) + void Objects_OnObjectProperties(object sender, ObjectPropertiesEventArgs e) { lock (PrimsWaiting) { - PrimsWaiting.Remove(properties.ObjectID); + PrimsWaiting.Remove(e.Properties.ObjectID); if (PrimsWaiting.Count == 0) AllPropertiesReceived.Set(); diff --git a/Programs/examples/TestClient/Commands/Prims/FindObjectsCommand.cs b/Programs/examples/TestClient/Commands/Prims/FindObjectsCommand.cs index 8ff43325..90b75e25 100644 --- a/Programs/examples/TestClient/Commands/Prims/FindObjectsCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/FindObjectsCommand.cs @@ -14,7 +14,7 @@ namespace OpenMetaverse.TestClient public FindObjectsCommand(TestClient testClient) { - testClient.Objects.OnObjectProperties += new ObjectManager.ObjectPropertiesCallback(Objects_OnObjectProperties); + testClient.Objects.ObjectProperties += new EventHandler(Objects_OnObjectProperties); Name = "findobjects"; Description = "Finds all objects, which name contains search-string. " + @@ -83,16 +83,16 @@ namespace OpenMetaverse.TestClient return AllPropertiesReceived.WaitOne(2000 + msPerRequest * objects.Count, false); } - void Objects_OnObjectProperties(Simulator simulator, Primitive.ObjectProperties properties) + void Objects_OnObjectProperties(object sender, ObjectPropertiesEventArgs e) { lock (PrimsWaiting) { Primitive prim; - if (PrimsWaiting.TryGetValue(properties.ObjectID, out prim)) + if (PrimsWaiting.TryGetValue(e.Properties.ObjectID, out prim)) { - prim.Properties = properties; + prim.Properties = e.Properties; } - PrimsWaiting.Remove(properties.ObjectID); + PrimsWaiting.Remove(e.Properties.ObjectID); if (PrimsWaiting.Count == 0) AllPropertiesReceived.Set(); diff --git a/Programs/examples/TestClient/Commands/Prims/ImportCommand.cs b/Programs/examples/TestClient/Commands/Prims/ImportCommand.cs index 5c2755f4..d01de4b1 100644 --- a/Programs/examples/TestClient/Commands/Prims/ImportCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/ImportCommand.cs @@ -46,8 +46,8 @@ namespace OpenMetaverse.TestClient Name = "import"; Description = "Import prims from an exported xml file. Usage: import inputfile.xml [usegroup]"; Category = CommandCategory.Objects; - - testClient.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); + + testClient.Objects.NewPrim += Objects_OnNewPrim; } public override string Execute(string[] args, UUID fromAgentID) @@ -182,8 +182,10 @@ namespace OpenMetaverse.TestClient return "Import complete."; } - void Objects_OnNewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) + void Objects_OnNewPrim(object sender, PrimEventArgs e) { + Primitive prim = e.Prim; + if ((prim.Flags & PrimFlags.CreateSelected) == 0) return; // We received an update for an object we didn't create @@ -197,23 +199,23 @@ namespace OpenMetaverse.TestClient { Console.WriteLine("Setting properties for " + prim.LocalID); // TODO: Is there a way to set all of this at once, and update more ObjectProperties stuff? - Client.Objects.SetPosition(simulator, prim.LocalID, currentPosition); - Client.Objects.SetTextures(simulator, prim.LocalID, currentPrim.Textures); + Client.Objects.SetPosition(e.Simulator, prim.LocalID, currentPosition); + Client.Objects.SetTextures(e.Simulator, prim.LocalID, currentPrim.Textures); if (currentPrim.Light.Intensity > 0) { - Client.Objects.SetLight(simulator, prim.LocalID, currentPrim.Light); + Client.Objects.SetLight(e.Simulator, prim.LocalID, currentPrim.Light); } - Client.Objects.SetFlexible(simulator, prim.LocalID, currentPrim.Flexible); + Client.Objects.SetFlexible(e.Simulator, prim.LocalID, currentPrim.Flexible); if (currentPrim.Sculpt.SculptTexture != UUID.Zero) { - Client.Objects.SetSculpt(simulator, prim.LocalID, currentPrim.Sculpt); + Client.Objects.SetSculpt(e.Simulator, prim.LocalID, currentPrim.Sculpt); } if (!String.IsNullOrEmpty(currentPrim.Properties.Name)) - Client.Objects.SetName(simulator, prim.LocalID, currentPrim.Properties.Name); + Client.Objects.SetName(e.Simulator, prim.LocalID, currentPrim.Properties.Name); if (!String.IsNullOrEmpty(currentPrim.Properties.Description)) - Client.Objects.SetDescription(simulator, prim.LocalID, currentPrim.Properties.Description); + Client.Objects.SetDescription(e.Simulator, prim.LocalID, currentPrim.Properties.Description); primsCreated.Add(prim); primDone.Set(); diff --git a/Programs/examples/TestClient/Commands/Prims/PrimInfoCommand.cs b/Programs/examples/TestClient/Commands/Prims/PrimInfoCommand.cs index 0569368d..e07ac9f6 100644 --- a/Programs/examples/TestClient/Commands/Prims/PrimInfoCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/PrimInfoCommand.cs @@ -57,21 +57,22 @@ namespace OpenMetaverse.TestClient } AutoResetEvent propsEvent = new AutoResetEvent(false); - ObjectManager.ObjectPropertiesCallback propsCallback = - delegate(Simulator simulator, Primitive.ObjectProperties props) + EventHandler propsCallback = + delegate(object sender, ObjectPropertiesEventArgs e) { Logger.Log(String.Format( "Category: {0}\nFolderID: {1}\nFromTaskID: {2}\nInventorySerial: {3}\nItemID: {4}\nCreationDate: {5}", - props.Category, props.FolderID, props.FromTaskID, props.InventorySerial, props.ItemID, props.CreationDate), Helpers.LogLevel.Info); + e.Properties.Category, e.Properties.FolderID, e.Properties.FromTaskID, e.Properties.InventorySerial, + e.Properties.ItemID, e.Properties.CreationDate), Helpers.LogLevel.Info); propsEvent.Set(); }; - Client.Objects.OnObjectProperties += propsCallback; + Client.Objects.ObjectProperties += propsCallback; Client.Objects.SelectObject(Client.Network.CurrentSim, target.LocalID, true); propsEvent.WaitOne(1000 * 10, false); - Client.Objects.OnObjectProperties -= propsCallback; + Client.Objects.ObjectProperties -= propsCallback; return "Done."; } diff --git a/Programs/examples/TestClient/Commands/Prims/TexturesCommand.cs b/Programs/examples/TestClient/Commands/Prims/TexturesCommand.cs index e2886c71..48de3c13 100644 --- a/Programs/examples/TestClient/Commands/Prims/TexturesCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/TexturesCommand.cs @@ -17,9 +17,9 @@ namespace OpenMetaverse.TestClient Name = "textures"; Description = "Turns automatic texture downloading on or off. Usage: textures [on/off]"; Category = CommandCategory.Objects; - - testClient.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); - testClient.Objects.OnNewAvatar += new ObjectManager.NewAvatarCallback(Objects_OnNewAvatar); + + testClient.Objects.NewPrim += new EventHandler(Objects_OnNewPrim); + testClient.Objects.NewAvatar += Objects_OnNewAvatar; } public override string Execute(string[] args, UUID fromAgentID) @@ -43,8 +43,9 @@ namespace OpenMetaverse.TestClient } } - void Objects_OnNewAvatar(Simulator simulator, Avatar avatar, ulong regionHandle, ushort timeDilation) + void Objects_OnNewAvatar(object sender, NewAvatarEventArgs e) { + Avatar avatar = e.Avatar; if (enabled) { // Search this avatar for textures @@ -79,8 +80,10 @@ namespace OpenMetaverse.TestClient } } - void Objects_OnNewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) + void Objects_OnNewPrim(object sender, PrimEventArgs e) { + Primitive prim = e.Prim; + if (enabled) { // Search this prim for textures diff --git a/Programs/importprimscript/importprimscript.cs b/Programs/importprimscript/importprimscript.cs index 7ec6c218..1ee96747 100644 --- a/Programs/importprimscript/importprimscript.cs +++ b/Programs/importprimscript/importprimscript.cs @@ -65,7 +65,7 @@ namespace importprimscript } // Add callback handlers for asset uploads finishing. new prims spotted, and logging - Client.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); + Client.Objects.NewPrim += new EventHandler(Objects_OnNewPrim); Logger.OnLogMessage += new Logger.LogCallback(Client_OnLogMessage); // Optimize the connection for our purposes @@ -239,8 +239,9 @@ namespace importprimscript return newAssetID; } - static void Objects_OnNewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) + static void Objects_OnNewPrim(object sender, PrimEventArgs e) { + Primitive prim = e.Prim; if (CurrentSculpt != null && (prim.Flags & PrimFlags.CreateSelected) != 0 && !RezzedPrims.Contains(prim.LocalID)) {