From f1d3534818f094bf63e88f84eb607b58678246f2 Mon Sep 17 00:00:00 2001 From: cinder Date: Sat, 25 Jan 2025 08:11:17 -0600 Subject: [PATCH] Populate Attachments from COF as well, as it is a canonical source --- LibreMetaverse/AppearanceManager.cs | 58 +++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/LibreMetaverse/AppearanceManager.cs b/LibreMetaverse/AppearanceManager.cs index f876aeda..c17c098e 100644 --- a/LibreMetaverse/AppearanceManager.cs +++ b/LibreMetaverse/AppearanceManager.cs @@ -607,7 +607,7 @@ public bool ServerBakingRegion() /// /// Returns a List of worn items in COF. Also populates - /// and fires + /// and before firing /// /// of in COF public List RequestAgentWorn() @@ -619,7 +619,7 @@ public List RequestAgentWorn() return null; } // Fetch from cache... - List contents = Client.Inventory.Store.GetContents(cof.UUID); + var contents = Client.Inventory.Store.GetContents(cof.UUID); // If that fails, fetch from server... if (contents == null || contents.Count == 0) @@ -631,20 +631,44 @@ public List RequestAgentWorn() var wearables = new MultiValueDictionary(); foreach (var item in contents) { - if (item is InventoryWearable wearable) + switch (item) { - InventoryWearable w = wearable; - if (wearable.IsLink() && Client.Inventory.Store.Contains(wearable.ActualUUID)) + case InventoryWearable wearable: { - w = Client.Inventory.Store[wearable.AssetUUID] as InventoryWearable; + var w = wearable; + if (wearable.IsLink() && Client.Inventory.Store.Contains(wearable.ActualUUID)) + { + w = Client.Inventory.Store[wearable.ActualUUID] as InventoryWearable; + } + wearables.Add(w.WearableType, new WearableData() + { + ItemID = w.UUID, + AssetID = w.ActualUUID, + AssetType = w.AssetType, + WearableType = w.WearableType + }); + break; + } + case InventoryAttachment attachment: + { + var a = attachment; + if (attachment.IsLink() && Client.Inventory.Store.Contains(attachment.ActualUUID)) + { + a = Client.Inventory.Store[attachment.ActualUUID] as InventoryAttachment; + } + Attachments.AddOrUpdate(a.ActualUUID, a.AttachmentPoint, (id, point) => a.AttachmentPoint); + break; } - wearables.Add(w.WearableType, new WearableData() + case InventoryObject attachedObject: { - ItemID = w.UUID, - AssetID = w.AssetUUID, - AssetType = w.AssetType, - WearableType = w.WearableType - }); + var a = attachedObject; + if (attachedObject.IsLink() && Client.Inventory.Store.Contains(attachedObject.ActualUUID)) + { + a = Client.Inventory.Store[attachedObject.ActualUUID] as InventoryObject; + } + Attachments.AddOrUpdate(a.ActualUUID, a.AttachPoint, (id, point) => a.AttachPoint); + break; + } } } lock (Wearables) { Wearables = wearables; } @@ -1228,6 +1252,16 @@ private bool GatherAgentAttachments() return true; } + public bool isItemAttached(InventoryItem item) + { + return isItemAttached(item.ActualUUID); + } + + public bool isItemAttached(UUID key) + { + return Attachments.ContainsKey(key); + } + /// /// Returns a collection of the agents currently worn attachments ///