OSDN Git Service

RAD-84 (progress): Added @getinvworn
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 23 Apr 2012 03:07:30 +0000 (03:07 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 23 Apr 2012 03:07:30 +0000 (03:07 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1280 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/RLV/RLVManager.cs
Radegast/GUI/Consoles/Inventory/CurrentOutfitFolder.cs

index 3cf70ee..c418c4d 100644 (file)
@@ -620,7 +620,7 @@ namespace Radegast
                             {
                                 foreach (var f in folder.Nodes.Values)
                                 {
-                                    if (f.Data is InventoryFolder)
+                                    if (f.Data is InventoryFolder && !f.Data.Name.StartsWith("."))
                                     {
                                         res += f.Data.Name + ",";
                                     }
@@ -631,6 +631,27 @@ namespace Radegast
                         }
                         break;
 
+                    case "getinvworn":
+                        if (int.TryParse(rule.Param, out chan) && chan > 0)
+                        {
+                            string res = string.Empty;
+                            InventoryNode root = FindFolder(rule.Option);
+                            if (root != null)
+                            {
+                                res += "|" + GetWornIndicator(root) + ",";
+                                foreach (var n in root.Nodes.Values)
+                                {
+                                    if (n.Data is InventoryFolder && !n.Data.Name.StartsWith("."))
+                                    {
+                                        res += n.Data.Name + "|" + GetWornIndicator(n) + ",";
+                                    }
+                                }
+                            }
+
+                            client.Self.Chat(res.TrimEnd(','), chan, ChatType.Normal);
+                        }
+                        break;
+
                     #endregion #RLV folder and outfit manipulation
 
                 }
@@ -640,6 +661,97 @@ namespace Radegast
             return true;
         }
 
+
+        public void AllSubfolderWearables(InventoryNode root, ref List<InventoryItem> WearableItems)
+        {
+            foreach (var n in root.Nodes.Values)
+            {
+                if (!n.Data.Name.StartsWith("."))
+                {
+                    if (n.Data is InventoryFolder)
+                    {
+                        AllSubfolderWearables(n, ref WearableItems);
+                    }
+                    else
+                    {
+                        WearableItems.Add((InventoryItem)n.Data);
+                    }
+                }
+            }
+
+        }
+
+        protected string GetWornIndicator(InventoryNode node)
+        {
+            var currentOutfit = client.Appearance.GetWearables();
+            var currentAttachments = client.Network.CurrentSim.ObjectsPrimitives.FindAll(p => p.ParentID == client.Self.LocalID);
+            int myItemsCount = 0;
+            int myItemsWornCount = 0;
+
+            foreach (var n in node.Nodes.Values)
+            {
+                if (CurrentOutfitFolder.CanBeWorn(n.Data) && !n.Data.Name.StartsWith("."))
+                {
+                    myItemsCount++;
+                    if ((n.Data is InventoryWearable && CurrentOutfitFolder.IsWorn(currentOutfit, (InventoryItem)n.Data)) ||
+                        CurrentOutfitFolder.IsAttached(currentAttachments, (InventoryItem)n.Data))
+                    {
+                        myItemsWornCount++;
+                    }
+                }
+            }
+
+            List<InventoryItem> allItems = new List<InventoryItem>();
+            foreach (var n in node.Nodes.Values)
+            {
+                if (n.Data is InventoryFolder && !n.Data.Name.StartsWith("."))
+                {
+                    AllSubfolderWearables(n, ref allItems);
+                }
+            }
+
+            int allItemsCount = 0;
+            int allItemsWornCount = 0;
+
+            foreach (var n in allItems)
+            {
+                if (CurrentOutfitFolder.CanBeWorn(n) && !n.Name.StartsWith("."))
+                {
+                    allItemsCount++;
+                    if ((n is InventoryWearable && CurrentOutfitFolder.IsWorn(currentOutfit, n)) ||
+                        CurrentOutfitFolder.IsAttached(currentAttachments, n))
+                    {
+                        allItemsWornCount++;
+                    }
+                }
+            }
+
+            return WornIndicator(myItemsCount, myItemsWornCount) + WornIndicator(allItemsCount, allItemsWornCount);
+        }
+
+        protected string WornIndicator(int nrMyItem, int nrWorn)
+        {
+            string first = "0";
+
+            if (nrMyItem > 0)
+            {
+                if (nrMyItem == nrWorn)
+                {
+                    first = "3";
+                }
+                else if (nrWorn > 0)
+                {
+                    first = "2";
+                }
+                else
+                {
+                    first = "1";
+                }
+            }
+
+            return first;
+        }
+
         public InventoryNode RLVRootFolder()
         {
             foreach (var rn in client.Inventory.Store.RootNode.Nodes.Values)
@@ -668,6 +780,8 @@ namespace Radegast
             }
             foreach (var n in currentNode.Nodes.Values)
             {
+                if (n.Data.Name.StartsWith(".")) continue;
+
                 var res = FindFolderInternal(n, currentPath + n.Data.Name.ToLower(), desiredPath);
                 if (res != null)
                 {
index 3b83b04..8ba4c46 100644 (file)
@@ -338,6 +338,34 @@ namespace Radegast
         }
 
         /// <summary>
+        /// Checks if inventory item of Wearable type is worn
+        /// </summary>
+        /// <param name="currentlyWorn">Current outfit</param>
+        /// <param name="item">Item to check</param>
+        /// <returns>True if the item is worn</returns>
+        public static bool IsWorn(Dictionary<WearableType, AppearanceManager.WearableData> currentlyWorn, InventoryItem item)
+        {
+            foreach (var n in currentlyWorn.Values)
+            {
+                if (n.ItemID == item.UUID)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Can this inventory type be worn
+        /// </summary>
+        /// <param name="item">Item to check</param>
+        /// <returns>True if the inventory item can be worn</returns>
+        public static bool CanBeWorn(InventoryBase item)
+        {
+            return item is InventoryWearable || item is InventoryAttachment || item is InventoryObject;
+        }
+
+        /// <summary>
         /// Attach an inventory item
         /// </summary>
         /// <param name="item">Item to be attached</param>