private void FindIngredientsInInventoryTracker(ProxyDictionary <int, int> ingredients) { CurrentIngredientInventories = null; CurrentIngredientInventories = new List <InventoryTracker>(); if (Inventories != null) { foreach (var inv in Inventories) { foreach (var ing in ingredients.Keys) { var items = inv.Items.Select(x => x.As <ObjectAccessor, ObjectItem>()) .Where(x => x.As <ObjectAccessor, ObjectItem>().ParentSheetIndex == ing); var fish = inv.Items.Select(x => x.As <ObjectAccessor, ObjectItem>()) .Where(x => x.As <ObjectAccessor, ObjectItem>().Category == ing); if (items.Count() > 0 || fish.Count() > 0 && !CurrentIngredientInventories.Contains(inv)) { CurrentIngredientInventories.Add(inv); } } } } }
private bool CheckInventoriesForIngredients(ProxyDictionary <int, int> ingredients) { var ingList = new List <IngredientTracker>(); var haveIngredients = true; // Iterate through the ingredients index foreach (var id in ingredients.Keys) { var ing = new IngredientTracker { Id = id, QuantityRequired = ingredients[id] }; var chestItems = Inventories.SelectMany(x => x.Items) .Where(under => under.Underlying.GetType().ToString() == "StardewValley.Object"); foreach (var inv in Inventories) { foreach (var item in inv.Items) { if (item.As <ObjectAccessor, ObjectItem>().ParentSheetIndex == id) { ing.QuantityWeHave += item.As <ObjectAccessor, ObjectItem>().Stack; } //Catch all Fish (Any) else if (item.As <ObjectAccessor, ObjectItem>().Category == id) { if (item.As <ObjectAccessor, ObjectItem>().Category == id) { ing.QuantityWeHave += item.As <ObjectAccessor, ObjectItem>().Stack; } } ingList.Add(ing); } } } foreach (var ing in ingList) { if (ing.QuantityRequired > ing.QuantityWeHave) { haveIngredients = false; } } return(haveIngredients); }
/// <summary> /// Initializes a new instance of the <see cref="ProxyValueCollection"/> class. /// </summary> /// <param name="dictionary">The dictionary.</param> public ProxyValueCollection(ProxyDictionary <TKey, TValue> dictionary) { this.dictionary = dictionary; }
private void UpdateItemsInInventoriesAfterCrafting(ProxyDictionary <int, int> ingredients) { // Id : Quantity var inventories = GetAllInventories(); var ingList = new List <IngredientTracker>(); var quantTotal = 0; var hasUsedAllInventory = false; foreach (var key in ingredients.Keys) { ingList.Add(new IngredientTracker { Id = key, QuantityRequired = ingredients[key] }); quantTotal += ingredients[key]; } try { if (CurrentIngredientInventories.Count > 0) { while (quantTotal != 0) { if (ingList.Exists(x => x.Id == -4)) { var emptyFish = ingList.Select(x => x) .Where(x => x.Id == -4) .Where(x => x.QuantityRequired == 0); if (emptyFish != null) { foreach (var fish in emptyFish) { ingredients.Remove(fish.Id); } FindIngredientsInInventoryTracker(ingredients); } } // Make sure if we have fulfilled the required quantity, we remove from the ingredient list. if (ingList.Exists(x => x.QuantityRequired == 0)) { ingList.RemoveAll(x => x.QuantityRequired == 0); } foreach (var ing in ingList) { foreach (var inv in CurrentIngredientInventories) { var selectedInv = inventories.FirstOrDefault(x => x.As <ChestAccessor, Chest>().BoundingBox.X == inv.Position.X && x.As <ChestAccessor, Chest>().BoundingBox.Y == inv.Position.Y); if (selectedInv != null) { foreach (var item in selectedInv.As <ChestAccessor, Chest>().Items) { //if (item.Underlying.GetType().ToString() == "StardewValley.Object") if (item.Is <ObjectAccessor>()) { //Check characters inventory first var charItems = Root.Player.Items; if (!hasUsedAllInventory) { for (int i = 0; i < charItems.Count; i++) { if (charItems[i] != null) { if (charItems[i].Is <ObjectAccessor>()) { if (ing.Id == charItems[i].As <ObjectAccessor, ObjectItem>().ParentSheetIndex&& ing.QuantityRequired > 0) { // This particular item has more than enough quantity in its stack for this recipe. if (charItems[i].As <ObjectAccessor, ObjectItem>().Stack > ing.QuantityRequired) { charItems[i].As <ObjectAccessor, ObjectItem>().Stack -= ing.QuantityRequired; quantTotal -= ing.QuantityRequired; ing.QuantityRequired = 0; } // This particular item doesnt have the required stack for this recipe. Remove it. else if (charItems[i].As <ObjectAccessor, ObjectItem>().Stack <= ing.QuantityRequired && ing.QuantityRequired > 0) { ing.QuantityRequired -= charItems[i].As <ObjectAccessor, ObjectItem>().Stack; quantTotal -= charItems[i].As <ObjectAccessor, ObjectItem>().Stack; charItems[i] = null; hasUsedAllInventory = true; Update(); } } //Fish (Any) else if (ing.Id == charItems[i].As <ObjectAccessor, ObjectItem>().Category&& ing.QuantityRequired > 0) { // This particular item has more than enough quantity in its stack for this recipe. if (charItems[i].As <ObjectAccessor, ObjectItem>().Stack > ing.QuantityRequired) { charItems[i].As <ObjectAccessor, ObjectItem>().Stack -= ing.QuantityRequired; quantTotal -= ing.QuantityRequired; ing.QuantityRequired = 0; } // This particular item doesnt have the required stack for this recipe. Remove it. else if (charItems[i].As <ObjectAccessor, ObjectItem>().Stack <= ing.QuantityRequired && ing.QuantityRequired > 0) { ing.QuantityRequired -= charItems[i].As <ObjectAccessor, ObjectItem>().Stack; quantTotal -= charItems[i].As <ObjectAccessor, ObjectItem>().Stack; charItems[i] = null; hasUsedAllInventory = true; Update(); } } } } } } if (ing.Id == item.As <ObjectAccessor, ObjectItem>().ParentSheetIndex&& ing.QuantityRequired > 0) { // This particular item has more than enough quantity in its stack for this recipe. if (item.As <ObjectAccessor, ObjectItem>().Stack > ing.QuantityRequired) { quantTotal -= ing.QuantityRequired; item.As <ObjectAccessor, ObjectItem>().Stack -= ing.QuantityRequired; ing.QuantityRequired = 0; } // This particular item doesnt have the required stack for this recipe. Remove it. else if (item.As <ObjectAccessor, ObjectItem>().Stack <= ing.QuantityRequired && ing.QuantityRequired > 0) { ing.QuantityRequired -= item.As <ObjectAccessor, ObjectItem>().Stack; quantTotal -= item.As <ObjectAccessor, ObjectItem>().Stack; selectedInv.As <ChestAccessor, Chest>().Items.Remove(item); Update(); } } // Fish (Any) else if (ing.Id == item.As <ObjectAccessor, ObjectItem>().Category&& ing.QuantityRequired > 0) { // This particular item has more than enough quantity in its stack for this recipe. if (item.As <ObjectAccessor, ObjectItem>().Stack > ing.QuantityRequired) { quantTotal -= ing.QuantityRequired; item.As <ObjectAccessor, ObjectItem>().Stack -= ing.QuantityRequired; ing.QuantityRequired = 0; } // This particular item doesnt have the required stack for this recipe. Remove it. else if (item.As <ObjectAccessor, ObjectItem>().Stack <= ing.QuantityRequired && ing.QuantityRequired > 0) { ing.QuantityRequired -= item.As <ObjectAccessor, ObjectItem>().Stack; quantTotal -= item.As <ObjectAccessor, ObjectItem>().Stack; selectedInv.As <ChestAccessor, Chest>().Items.Remove(item); Update(); } } if (quantTotal == 0) { goto QuantityZero; } } } } } } QuantityZero: continue; } } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } }