コード例 #1
0
        public void AddAttachments(List <InventoryItem> attachments, bool removeExistingFirst)
        {
            // Use RezMultipleAttachmentsFromInv  to clear out current attachments, and attach new ones
            RezMultipleAttachmentsFromInvPacket attachmentsPacket = new RezMultipleAttachmentsFromInvPacket();

            attachmentsPacket.AgentData.AgentID   = Client.Network.AgentID;
            attachmentsPacket.AgentData.SessionID = Client.Network.SessionID;

            attachmentsPacket.HeaderData.CompoundMsgID  = LLUUID.Random();
            attachmentsPacket.HeaderData.FirstDetachAll = true;
            attachmentsPacket.HeaderData.TotalObjects   = (byte)attachments.Count;

            attachmentsPacket.ObjectData = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[attachments.Count];
            for (int i = 0; i < attachments.Count; i++)
            {
                attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                attachmentsPacket.ObjectData[i].AttachmentPt  = 0;
                attachmentsPacket.ObjectData[i].EveryoneMask  = attachments[i].EveryoneMask;
                attachmentsPacket.ObjectData[i].GroupMask     = attachments[i].GroupMask;
                attachmentsPacket.ObjectData[i].ItemFlags     = attachments[i].Flags;
                attachmentsPacket.ObjectData[i].ItemID        = attachments[i].ItemID;
                attachmentsPacket.ObjectData[i].Name          = Helpers.StringToField(attachments[i].Name);
                attachmentsPacket.ObjectData[i].Description   = Helpers.StringToField(attachments[i].Description);
                attachmentsPacket.ObjectData[i].NextOwnerMask = attachments[i].NextOwnerMask;
                attachmentsPacket.ObjectData[i].OwnerID       = attachments[i].OwnerID;
            }

            Client.Network.SendPacket(attachmentsPacket);
        }
コード例 #2
0
        public void AddAttachments(List<InventoryItem> attachments, bool removeExistingFirst)
        {
            // Use RezMultipleAttachmentsFromInv  to clear out current attachments, and attach new ones
            RezMultipleAttachmentsFromInvPacket attachmentsPacket = new RezMultipleAttachmentsFromInvPacket();
            attachmentsPacket.AgentData.AgentID = Client.Network.AgentID;
            attachmentsPacket.AgentData.SessionID = Client.Network.SessionID;

            attachmentsPacket.HeaderData.CompoundMsgID = LLUUID.Random();
            attachmentsPacket.HeaderData.FirstDetachAll = true;
            attachmentsPacket.HeaderData.TotalObjects = (byte)attachments.Count;

            attachmentsPacket.ObjectData = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[attachments.Count];
            for (int i = 0; i < attachments.Count; i++)
            {
                attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                attachmentsPacket.ObjectData[i].AttachmentPt = 0;
                attachmentsPacket.ObjectData[i].EveryoneMask = attachments[i].EveryoneMask;
                attachmentsPacket.ObjectData[i].GroupMask = attachments[i].GroupMask;
                attachmentsPacket.ObjectData[i].ItemFlags = attachments[i].Flags;
                attachmentsPacket.ObjectData[i].ItemID = attachments[i].ItemID;
                attachmentsPacket.ObjectData[i].Name = Helpers.StringToField(attachments[i].Name);
                attachmentsPacket.ObjectData[i].Description = Helpers.StringToField(attachments[i].Description);
                attachmentsPacket.ObjectData[i].NextOwnerMask = attachments[i].NextOwnerMask;
                attachmentsPacket.ObjectData[i].OwnerID = attachments[i].OwnerID;
            }

            Client.Network.SendPacket(attachmentsPacket);
        }
コード例 #3
0
        /// <summary>
        /// Adds a list of attachments to our agent
        /// </summary>
        /// <param name="attachments">A List containing the attachments to add</param>
        /// <param name="removeExistingFirst">If true, tells simulator to remove existing attachment
        /// <param name="replace">If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments)</param>
        /// first</param>
        public void AddAttachments(List<InventoryItem> attachments, bool removeExistingFirst, bool replace)
        {
            // Use RezMultipleAttachmentsFromInv  to clear out current attachments, and attach new ones
            RezMultipleAttachmentsFromInvPacket attachmentsPacket = new RezMultipleAttachmentsFromInvPacket();
            attachmentsPacket.AgentData.AgentID = Client.Self.AgentID;
            attachmentsPacket.AgentData.SessionID = Client.Self.SessionID;

            attachmentsPacket.HeaderData.CompoundMsgID = UUID.Random();
            attachmentsPacket.HeaderData.FirstDetachAll = removeExistingFirst;
            attachmentsPacket.HeaderData.TotalObjects = (byte)attachments.Count;

            attachmentsPacket.ObjectData = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[attachments.Count];
            for (int i = 0; i < attachments.Count; i++)
            {
                if (attachments[i] is InventoryAttachment)
                {
                    InventoryAttachment attachment = (InventoryAttachment)attachments[i];
                    attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                    attachmentsPacket.ObjectData[i].AttachmentPt = replace ? (byte)attachment.AttachmentPoint : (byte)(ATTACHMENT_ADD | (byte)attachment.AttachmentPoint);
                    attachmentsPacket.ObjectData[i].EveryoneMask = (uint)attachment.Permissions.EveryoneMask;
                    attachmentsPacket.ObjectData[i].GroupMask = (uint)attachment.Permissions.GroupMask;
                    attachmentsPacket.ObjectData[i].ItemFlags = (uint)attachment.Flags;
                    attachmentsPacket.ObjectData[i].ItemID = attachment.UUID;
                    attachmentsPacket.ObjectData[i].Name = Utils.StringToBytes(attachment.Name);
                    attachmentsPacket.ObjectData[i].Description = Utils.StringToBytes(attachment.Description);
                    attachmentsPacket.ObjectData[i].NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask;
                    attachmentsPacket.ObjectData[i].OwnerID = attachment.OwnerID;
                }
                else if (attachments[i] is InventoryObject)
                {
                    InventoryObject attachment = (InventoryObject)attachments[i];
                    attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                    attachmentsPacket.ObjectData[i].AttachmentPt = replace ? (byte)0 : ATTACHMENT_ADD;
                    attachmentsPacket.ObjectData[i].EveryoneMask = (uint)attachment.Permissions.EveryoneMask;
                    attachmentsPacket.ObjectData[i].GroupMask = (uint)attachment.Permissions.GroupMask;
                    attachmentsPacket.ObjectData[i].ItemFlags = (uint)attachment.Flags;
                    attachmentsPacket.ObjectData[i].ItemID = attachment.UUID;
                    attachmentsPacket.ObjectData[i].Name = Utils.StringToBytes(attachment.Name);
                    attachmentsPacket.ObjectData[i].Description = Utils.StringToBytes(attachment.Description);
                    attachmentsPacket.ObjectData[i].NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask;
                    attachmentsPacket.ObjectData[i].OwnerID = attachment.OwnerID;
                }
                else
                {
                    Logger.Log("Cannot attach inventory item " + attachments[i].Name, Helpers.LogLevel.Warning, Client);
                }
            }

            Client.Network.SendPacket(attachmentsPacket);
        }
コード例 #4
0
 public void RezMultipleAttachmentsFromInventory(
     IClientAPI remoteClient,
     RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
     RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
 {
     foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
     {
         RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt);
     }
 }
コード例 #5
0
        /// <summary>
        /// Adds a list of attachments to avatar
        /// </summary>
        /// <param name="attachments">A List containing the attachments to add</param>
        /// <param name="removeExistingFirst">If true, tells simulator to remove existing attachment
        /// first</param>
        public void AddAttachments(List<InventoryBase> attachments, bool removeExistingFirst)
        {
            // FIXME: Obey this
            //const int OBJECTS_PER_PACKET = 4;

            // Use RezMultipleAttachmentsFromInv  to clear out current attachments, and attach new ones
            RezMultipleAttachmentsFromInvPacket attachmentsPacket = new RezMultipleAttachmentsFromInvPacket();
            attachmentsPacket.AgentData.AgentID = Network.AgentID;
            attachmentsPacket.AgentData.SessionID = Network.SessionID;

            attachmentsPacket.HeaderData.CompoundMsgID = UUID.Random();
            attachmentsPacket.HeaderData.FirstDetachAll = removeExistingFirst;
            attachmentsPacket.HeaderData.TotalObjects = (byte)attachments.Count;

            attachmentsPacket.ObjectData = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[attachments.Count];
            for (int i = 0; i < attachments.Count; i++)
            {
                if (attachments[i] is InventoryAttachment)
                {
                    InventoryAttachment attachment = (InventoryAttachment)attachments[i];
                    attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                    attachmentsPacket.ObjectData[i].AttachmentPt = (byte)attachment.AttachmentPoint;
                    attachmentsPacket.ObjectData[i].EveryoneMask = (uint)attachment.Permissions.EveryoneMask;
                    attachmentsPacket.ObjectData[i].GroupMask = (uint)attachment.Permissions.GroupMask;
                    attachmentsPacket.ObjectData[i].ItemFlags = (uint)attachment.Flags;
                    attachmentsPacket.ObjectData[i].ItemID = attachment.UUID;
                    attachmentsPacket.ObjectData[i].Name = Utils.StringToBytes(attachment.Name);
                    attachmentsPacket.ObjectData[i].Description = Utils.StringToBytes(attachment.Description);
                    attachmentsPacket.ObjectData[i].NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask;
                    attachmentsPacket.ObjectData[i].OwnerID = attachment.OwnerID;
                }
                else if (attachments[i] is InventoryObject)
                {
                    InventoryObject attachment = (InventoryObject)attachments[i];
                    attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock();
                    attachmentsPacket.ObjectData[i].AttachmentPt = 0;
                    attachmentsPacket.ObjectData[i].EveryoneMask = (uint)attachment.Permissions.EveryoneMask;
                    attachmentsPacket.ObjectData[i].GroupMask = (uint)attachment.Permissions.GroupMask;
                    attachmentsPacket.ObjectData[i].ItemFlags = (uint)attachment.Flags;
                    attachmentsPacket.ObjectData[i].ItemID = attachment.UUID;
                    attachmentsPacket.ObjectData[i].Name = Utils.StringToBytes(attachment.Name);
                    attachmentsPacket.ObjectData[i].Description = Utils.StringToBytes(attachment.Description);
                    attachmentsPacket.ObjectData[i].NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask;
                    attachmentsPacket.ObjectData[i].OwnerID = attachment.OwnerID;
                }
                else
                {
                    Log.Log("Cannot attach inventory item of type " + attachments[i].GetType().ToString(),
                        Helpers.LogLevel.Warning);
                }
            }

            Network.SendPacket(attachmentsPacket);
        }
コード例 #6
0
        public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
                                       RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
        {
            remoteClient.RunAttachmentOperation(() =>
            {
                ScenePresence presence;
                if (!TryGetAvatar(remoteClient.AgentId, out presence))
                    return;

                if (header.FirstDetachAll)
                {
                    foreach (UUID itemId in presence.CollectAttachmentItemIds())
                        this.DetachSingleAttachmentToInvSync(itemId, remoteClient);

                    this.ClearAllAttachments(presence);
                }

                bool updated = false;

                foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
                {
                    bool append = (((uint)obj.AttachmentPt & 0x80) != 0);         // Are we appending?
                    uint attachPoint = ((uint)obj.AttachmentPt & 0x7f);           // And strip the append bit

                    // Are we already attached?
                    if (presence.Appearance.GetAttachmentForItem(obj.ItemID) == null)
                    {
                        SceneObjectGroup sog = RezSingleAttachmentSync(remoteClient, obj.ItemID, attachPoint, append);
                        if (sog != null)
                            updated = true;
                    }
                }

                if (updated)
                {
                    IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
                    if (ava != null)
                        ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance, null, null);
                }
            });
        }
コード例 #7
0
ファイル: AttachmentsModule.cs プロジェクト: NovaGrid/opensim
        public void RezMultipleAttachmentsFromInventory(
            IClientAPI remoteClient, 
            RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
            RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
        {
            ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);

            if (sp == null)
            {
                m_log.ErrorFormat(
                    "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezMultipleAttachmentsFromInventory()",
                    remoteClient.Name, remoteClient.AgentId);
                return;
            }

            lock (sp.AttachmentsSyncLock)
            {
//                m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing multiple attachments from inventory for {0}", sp.Name);

                foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
                {
                    RezSingleAttachmentFromInventory(sp, obj.ItemID, obj.AttachmentPt);
                }
            }
        }