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); }
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); }
/// <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); }
public void RezMultipleAttachmentsFromInventory( IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects) { foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects) { RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt); } }
/// <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); }
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); } }); }
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); } } }