diff --git a/MinecraftClient/Commands/Inventory.cs b/MinecraftClient/Commands/Inventory.cs index 4754d7b1..a48b6c06 100644 --- a/MinecraftClient/Commands/Inventory.cs +++ b/MinecraftClient/Commands/Inventory.cs @@ -87,13 +87,75 @@ namespace MinecraftClient.Commands Dictionary inventories = handler.GetInventories(); List availableIds = inventories.Keys.ToList(); StringBuilder response = new(); - response.Append(Translations.Get("cmd.inventory.inventories_available") + ":\n"); + response.AppendLine(Translations.Get("cmd.inventory.inventories_available")); foreach (int id in availableIds) response.AppendLine(String.Format(" #{0} - {1}ยง8", id, inventories[id].Title)); return response.ToString(); } + else if (args[0].ToLower().StartsWith("search") || args[0].ToLower().StartsWith("s")) + { + if (args.Length < 2) + return GetCmdDescTranslated(); + + if (!Enum.TryParse(args[1], true, out ItemType parsedItemType)) + return GetCmdDescTranslated(); + + bool shouldUseItemCount = args.Length >= 3; + int itemCount = 0; + + if (shouldUseItemCount && !int.TryParse(args[2], out itemCount)) + return GetCmdDescTranslated(); + + Dictionary inventories = handler.GetInventories(); + Dictionary> foundItems = new(); + + List availableInventories = inventories.Values.ToList(); + //availableInventories.Remove(availableInventories.Find(i => i.ID == 0)!); + + availableInventories.ForEach(inventory => + { + inventory.Items.Values + .ToList() + .FindAll(item => item.Type == parsedItemType && (shouldUseItemCount ? item.Count == itemCount : true)) + .ForEach(item => + { + if (!foundItems.ContainsKey(inventory.ID)) + { + foundItems.Add(inventory.ID, new List() { item }); + return; + } + + List invItems = foundItems[inventory.ID]; + invItems.Add(item); + foundItems.Remove(inventory.ID); + foundItems.Add(inventory.ID, invItems); + }); + }); + + if (foundItems.Count == 0) + return Translations.Get("cmd.inventory.no_found_items"); + + StringBuilder response = new(); + + response.AppendLine(Translations.Get("cmd.inventory.found_items") + ":"); + + foreach ((int invId, List itemsList) in new SortedDictionary>(foundItems)) + { + if (itemsList.Count > 0) + { + response.AppendLine(String.Format("{0} (#{1}):", inventories[invId].Title, invId)); + + foreach (Item item in itemsList) + response.AppendLine(String.Format("\t- {0}", item.ToString())); + + response.AppendLine(" "); + } + } + + return response.ToString(); + } else if (args[0].ToLower() == "help") { if (args.Length >= 2) @@ -240,7 +302,8 @@ namespace MinecraftClient.Commands "drop" => Translations.Get("cmd.inventory.help.drop") + usageStr + "/inventory > drop [all]\nAll means drop full stack", "creativegive" => Translations.Get("cmd.inventory.help.creativegive") + usageStr + "/inventory creativegive ", "creativedelete" => Translations.Get("cmd.inventory.help.creativedelete") + usageStr + "/inventory creativedelete ", - "inventories" => Translations.Get("cmd.inventory.help.list") + usageStr + "/inventory - Lists available inventories", + "inventories" => Translations.Get("cmd.inventory.help.inventories") + usageStr + "/inventory inventories", + "search" => Translations.Get("cmd.inventory.help.search") + usageStr + "/inventory search [count]", "help" => GetHelp(), _ => Translations.Get("cmd.inventory.help.unknown") + GetAvailableActions(), }; diff --git a/MinecraftClient/Resources/lang/en.ini b/MinecraftClient/Resources/lang/en.ini index 011569c7..e27e1ca9 100644 --- a/MinecraftClient/Resources/lang/en.ini +++ b/MinecraftClient/Resources/lang/en.ini @@ -329,7 +329,11 @@ cmd.inventory.help.shiftclick=Shift click an item. cmd.inventory.help.drop=Drop an item from inventory. cmd.inventory.help.creativegive=Give item in creative mode. cmd.inventory.help.creativedelete=Clear slot in creative mode. +cmd.inventory.help.inventories=List avaliable inventories +cmd.inventory.help.search=Search for an item in avaliable Inventories cmd.inventory.help.unknown=Unknown action. +cmd.inventory.found_items=Found items +cmd.inventory.no_found_items=Could not find the specified item in any of avaliable Inventories! # List cmd.list.desc=get the player list.