public AvatarAppearance WearFolder(AvatarAppearance avappearance, UUID user, UUID folderOwnerID) { InventoryFolderBase Folder2Wear = m_InventoryService.GetFolderByOwnerAndName(folderOwnerID, m_forceUserToWearFolderName); if (Folder2Wear != null) { List<InventoryItemBase> itemsInFolder = m_InventoryService.GetFolderItems(UUID.Zero, Folder2Wear.ID); InventoryFolderBase appearanceFolder = m_InventoryService.GetFolderForType(user, InventoryType.Wearable, AssetType.Clothing); InventoryFolderBase folderForAppearance = new InventoryFolderBase(UUID.Random(), "GridWear", user, -1, appearanceFolder.ID, 1); List<InventoryFolderBase> userFolders = m_InventoryService.GetFolderFolders(user, appearanceFolder.ID); bool alreadyThere = false; List<UUID> items2RemoveFromAppearence = new List<UUID>(); List<UUID> toDelete = new List<UUID>(); foreach (InventoryFolderBase folder in userFolders) { if (folder.Name == folderForAppearance.Name) { List<InventoryItemBase> itemsInCurrentFolder = m_InventoryService.GetFolderItems(UUID.Zero, folder.ID); foreach (InventoryItemBase itemBase in itemsInCurrentFolder) { items2RemoveFromAppearence.Add(itemBase.AssetID); items2RemoveFromAppearence.Add(itemBase.ID); toDelete.Add(itemBase.ID); } folderForAppearance = folder; alreadyThere = true; m_InventoryService.DeleteItems(user, toDelete); break; } } if (!alreadyThere) m_InventoryService.AddFolder(folderForAppearance); else { // we have to remove all the old items if they are currently wearing them for (int i = 0; i < avappearance.Wearables.Length; i++) { AvatarWearable wearable = avappearance.Wearables[i]; for (int ii = 0; ii < wearable.Count; ii++) { if (items2RemoveFromAppearence.Contains(wearable[ii].ItemID)) { avappearance.Wearables[i] = AvatarWearable.DefaultWearables[i]; break; } } } List<AvatarAttachment> attachments = avappearance.GetAttachments(); foreach (AvatarAttachment attachment in attachments) { if ((items2RemoveFromAppearence.Contains(attachment.AssetID)) || (items2RemoveFromAppearence.Contains(attachment.ItemID))) { avappearance.DetachAttachment(attachment.ItemID); } } } // ok, now we have a empty folder, lets add the items foreach (InventoryItemBase itemBase in itemsInFolder) { InventoryItemBase newcopy = m_InventoryService.InnerGiveInventoryItem(user, folderOwnerID, itemBase, folderForAppearance.ID, true, true); if (newcopy.InvType == (int) InventoryType.Object) { byte[] attobj = m_AssetService.GetData(newcopy.AssetID.ToString()); if (attobj != null) { string xmlData = Utils.BytesToString(attobj); XmlDocument doc = new XmlDocument(); try { doc.LoadXml(xmlData); } catch { continue; } if (doc.FirstChild.OuterXml.StartsWith("<groups>") || (doc.FirstChild.NextSibling != null && doc.FirstChild.NextSibling.OuterXml.StartsWith("<groups>"))) continue; string xml = ""; if ((doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) && (doc.FirstChild.NextSibling != null)) xml = doc.FirstChild.NextSibling.OuterXml; else xml = doc.FirstChild.OuterXml; doc.LoadXml(xml); if (doc.DocumentElement == null) continue; XmlNodeList xmlNodeList = doc.DocumentElement.SelectNodes("//State"); int attchspot; if ((xmlNodeList != null) && (int.TryParse(xmlNodeList[0].InnerText, out attchspot))) { AvatarAttachment a = new AvatarAttachment(attchspot, newcopy.ID, newcopy.AssetID); Dictionary<int, List<AvatarAttachment>> ac = avappearance.Attachments; if (!ac.ContainsKey(attchspot)) ac[attchspot] = new List<AvatarAttachment>(); ac[attchspot].Add(a); avappearance.Attachments = ac; } } } m_InventoryService.AddItem(newcopy); } } return avappearance; }
public void FixCurrentOutFitFolder(UUID user, ref AvatarAppearance avappearance) { InventoryFolderBase CurrentOutFitFolder = m_InventoryService.GetFolderForType(user, 0, AssetType.CurrentOutfitFolder); if (CurrentOutFitFolder == null) return; List<InventoryItemBase> ic = m_InventoryService.GetFolderItems(user, CurrentOutFitFolder.ID); List<UUID> brokenLinks = new List<UUID>(); List<UUID> OtherStuff = new List<UUID>(); foreach (var i in ic) { InventoryItemBase linkedItem = null; if ((linkedItem = m_InventoryService.GetItem(user, i.AssetID)) == null) brokenLinks.Add(i.ID); else if (linkedItem.ID == AvatarWearable.DEFAULT_EYES_ITEM || linkedItem.ID == AvatarWearable.DEFAULT_BODY_ITEM || linkedItem.ID == AvatarWearable.DEFAULT_HAIR_ITEM || linkedItem.ID == AvatarWearable.DEFAULT_PANTS_ITEM || linkedItem.ID == AvatarWearable.DEFAULT_SHIRT_ITEM || linkedItem.ID == AvatarWearable.DEFAULT_SKIN_ITEM) brokenLinks.Add(i.ID); //Default item link, needs removed else if (!OtherStuff.Contains(i.AssetID)) OtherStuff.Add(i.AssetID); } for (int i = 0; i < avappearance.Wearables.Length; i++) { AvatarWearable wearable = avappearance.Wearables[i]; for (int ii = 0; ii < wearable.Count; ii++) { if (!OtherStuff.Contains(wearable[ii].ItemID)) { InventoryItemBase linkedItem2 = null; if ((linkedItem2 = m_InventoryService.GetItem(user, wearable[ii].ItemID)) != null) { InventoryItemBase linkedItem3 = (InventoryItemBase) linkedItem2.Clone(); linkedItem3.AssetID = linkedItem2.ID; linkedItem3.AssetType = (int) AssetType.Link; linkedItem3.ID = UUID.Random(); linkedItem3.CurrentPermissions = linkedItem2.NextPermissions; linkedItem3.EveryOnePermissions = linkedItem2.NextPermissions; linkedItem3.Folder = CurrentOutFitFolder.ID; m_InventoryService.AddItem(linkedItem3); } else { avappearance.Wearables[i] = AvatarWearable.DefaultWearables[i]; } } } } List<UUID> items2UnAttach = new List<UUID>(); foreach (KeyValuePair<int, List<AvatarAttachment>> attachmentSpot in avappearance.Attachments) { foreach (AvatarAttachment attachment in attachmentSpot.Value) { if (!OtherStuff.Contains(attachment.ItemID)) { InventoryItemBase linkedItem2 = null; if ((linkedItem2 = m_InventoryService.GetItem(user, attachment.ItemID)) != null) { InventoryItemBase linkedItem3 = (InventoryItemBase) linkedItem2.Clone(); linkedItem3.AssetID = linkedItem2.ID; linkedItem3.AssetType = (int) AssetType.Link; linkedItem3.ID = UUID.Random(); linkedItem3.CurrentPermissions = linkedItem2.NextPermissions; linkedItem3.EveryOnePermissions = linkedItem2.NextPermissions; linkedItem3.Folder = CurrentOutFitFolder.ID; m_InventoryService.AddItem(linkedItem3); } else items2UnAttach.Add(attachment.ItemID); } } } foreach (UUID uuid in items2UnAttach) { avappearance.DetachAttachment(uuid); } if (brokenLinks.Count != 0) m_InventoryService.DeleteItems(user, brokenLinks); }