/// <summary> /// Convert rares into legendaries with Kanai's cube /// </summary> /// <param name="types">restrict the rares that can be selected by ItemType</param> public static async Task <bool> Execute(List <ItemSelectionType> types = null) { while (CanRun(types)) { if (!ZetaDia.IsInTown) { break; } Logger.Log("[CubeRaresToLegendary] CubeRaresToLegendary Started! Wooo!"); var backpackGuids = new HashSet <int>(ZetaDia.Me.Inventory.Backpack.Select(i => i.ACDGuid)); if (BackpackHasMaterials) { if (Town.Locations.KanaisCube.Distance(ZetaDia.Me.Position) > 10f || !GameUI.KanaisCubeWindow.IsVisible) { if (!await MoveToAndInteract.Execute(Town.Locations.KanaisCube, Town.ActorIds.KanaisCube, 3f)) { Logger.Log("Failed to move to the cube, quite unfortunate."); break; } continue; } Logger.Log("[CubeRaresToLegendary] Ready to go, Lets transmute!"); var item = GetBackPackRares(types).First(); var itemName = item.Name; var itemDynamicId = item.DynamicId; var itemInternalName = item.InternalName; var transmuteGroup = new List <ACDItem> { item, }; transmuteGroup.AddRange(Inventory.GetStacksUpToQuantity(Inventory.Backpack.ArcaneDust, 50)); transmuteGroup.AddRange(Inventory.GetStacksUpToQuantity(Inventory.Backpack.VeiledCrystals, 50)); transmuteGroup.AddRange(Inventory.GetStacksUpToQuantity(Inventory.Backpack.ReusableParts, 50)); transmuteGroup.AddRange(Inventory.GetStacksUpToQuantity(Inventory.Backpack.DeathsBreath, 25)); await Transmute.Execute(transmuteGroup); await Coroutine.Sleep(1500); var newItem = ZetaDia.Me.Inventory.Backpack.FirstOrDefault(i => !backpackGuids.Contains(i.ACDGuid)); if (newItem != null) { var newLegendaryItem = Legendary.GetItemByACD(newItem); Logger.Log("[CubeRaresToLegendary] Upgraded Rare '{0}' ---> '{1}' ({2})", itemName, newLegendaryItem.Name, newItem.ActorSNO); } else { Logger.Log("[CubeRaresToLegendary] Failed to upgrade Item '{0}' {1} DynId={2} HasBackpackMaterials={3}", itemName, itemInternalName, itemDynamicId, BackpackHasMaterials); } Inventory.InvalidItemDynamicIds.Add(itemDynamicId); } else if (StashHasMaterials) { Logger.Log("[CubeRaresToLegendary] Getting Materials from Stash"); if (!await TakeItemsFromStash.Execute(Inventory.RareUpgradeIds, 5000)) { return(true); } } else { Logger.Log("[CubeRaresToLegendary] Oh no! Out of materials!"); return(true); } await Coroutine.Sleep(500); await Coroutine.Yield(); } return(true); }
public static async Task <bool> Execute(List <ItemSelectionType> types = null) { if (!CanRun()) { return(true); } Logger.LogVerbose("[CubeItemsToMaterials] Getting Materials from Stash"); if (!Inventory.Materials.HasStackQuantityOfTypes(Inventory.MaterialConversionTypes, InventorySlot.BackpackItems, 100) && !await TakeItemsFromStash.Execute(Inventory.RareUpgradeIds, 5000)) { return(true); } Logger.LogVerbose("[CubeItemsToMaterials] Time to Convert some junk into delicious crafting materials."); if (!await MoveToAndInteract.Execute(Town.Locations.KanaisCube, Town.ActorIds.KanaisCube, 3f)) { Logger.Log("[CubeItemsToMaterials] Failed to move to the cube, quite unfortunate."); return(true); } if (_highest.Type == InventoryItemType.None) { Logger.Log("[CubeItemsToMaterials] Error: Highest material count is unknown."); return(true); } foreach (var material in _materials) { if (!await ConvertMaterials.Execute(_highest.Type, material.Key)) { Logger.Log("[Cube] Failed! Finished!"); return(true); } await Coroutine.Sleep(100); await Coroutine.Yield(); } Logger.LogVerbose("[Cube] CubeItemsToMaterials Finished!"); return(true); }