/// <summary> /// Sockets equipped or backpack weapons rubies. /// </summary> private async Task <bool> EquipWeaponSocket() { var gem = GetGemForAttributeType(PlayerAttributeType.Strength); if (gem == null) { return(false); } var socketableWeapon = InventoryManager.Equipped.FirstOrDefault(i => i.InventorySlot == InventorySlot.LeftHand && i.NumSockets > 0 && i.NumSocketsFilled < i.NumSockets); if (socketableWeapon != null) { Core.Logger.Log("Socketing {0} ({1}) into equipped weapon {2}", gem.InternalName, gem.GemQuality, socketableWeapon.Name); socketableWeapon.Socket(gem); return(true); } var socketableBackpackWeapon = BackpackEquipment .OrderByDescending(i => i.AcdItem.Sockets) .ThenByDescending(i => i.WeaponDamagePerSecond) .FirstOrDefault(i => i.InventorySlot == InventorySlot.LeftHand && i.AcdItem.NumSockets > 0 && i.AcdItem.NumSockets < i.AcdItem.NumSocketsFilled); if (socketableBackpackWeapon != null) { Core.Logger.Log("Socketing {0} ({1}) into backpack weapon {2}", gem.InternalName, gem.GemQuality, socketableBackpackWeapon.RealName); socketableBackpackWeapon.AcdItem.Socket(gem); return(true); } return(false); }
private IEnumerable <CachedACDItem> GetBackpackItemsForSlot(InventorySlot slot) { switch (slot) { case InventorySlot.Feet: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Boots)); case InventorySlot.Hands: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Gloves)); case InventorySlot.Head: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Helm || i.ItemType == ItemType.WizardHat || i.ItemType == ItemType.SpiritStone || i.ItemType == ItemType.VoodooMask)); case InventorySlot.Shoulders: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Shoulder)); case InventorySlot.Torso: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Chest || i.ItemType == ItemType.Cloak)); case InventorySlot.Waist: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Belt || i.ItemType == ItemType.MightyBelt)); case InventorySlot.Bracers: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Bracer)); case InventorySlot.Legs: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Legs)); case InventorySlot.Neck: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Amulet)); case InventorySlot.LeftFinger: case InventorySlot.RightFinger: return(BackpackEquipment.Where(i => i.ItemType == ItemType.Ring)); case InventorySlot.RightHand: if (Core.Settings.Items.AutoEquipIgnoreWeapons) { return(null); } return(BackpackEquipment.Where(i => i.TrinityItemBaseType == TrinityItemBaseType.Offhand || i.TrinityItemType == TrinityItemType.CrusaderShield)); case InventorySlot.LeftHand: if (Core.Settings.Items.AutoEquipIgnoreWeapons) { return(null); } return(BackpackEquipment.Where(i => i.BaseType == ItemBaseType.Weapon && (i.OneHanded || i.TwoHanded))); } return(null); }
/// <summary> /// Sockets equipped or backpack armor with primary stat or vitality /// </summary> /// <returns></returns> private async Task <bool> EquipArmorSockets() { var attrType = GetAttributeTypeForClass(Core.Player.ActorClass); var gem = GetGemForAttributeType(attrType); if (gem == null) { gem = GetGemForAttributeType(PlayerAttributeType.Vitality); } if (gem == null) { return(false); } var socketableArmor = InventoryManager.Equipped .FirstOrDefault(i => (i.ItemBaseType == ItemBaseType.Armor || i.ItemBaseType == ItemBaseType.Jewelry) && i.NumSockets > 0 && i.NumSocketsFilled < i.NumSockets); if (socketableArmor != null) { Core.Logger.Log("Socketing {0} ({1}) into equipped armor {2}", gem.InternalName, gem.Stats.GemQuality, socketableArmor.Name); socketableArmor.Socket(gem); return(true); } var socketableBackpackArmor = BackpackEquipment .OrderByDescending(i => i.AcdItem.Sockets) .ThenByDescending(i => i.HighestPrimary) .FirstOrDefault(i => (i.BaseType == ItemBaseType.Armor || i.BaseType == ItemBaseType.Jewelry) && i.AcdItem.NumSockets > 0 && i.AcdItem.NumSockets < i.AcdItem.NumSocketsFilled); if (socketableBackpackArmor != null) { Core.Logger.Log("Socketing {0} ({1}) into backpack armor {2}", gem.InternalName, gem.Stats.GemQuality, socketableBackpackArmor.RealName); socketableBackpackArmor.AcdItem.Socket(gem); return(true); } return(false); }
public async Task <bool> Execute() { if (!Core.Settings.Items.AutoEquipItems) { return(false); } if (!Core.Player.IsValid || Core.Player.IsInCombat || !ZetaDia.IsInGame || ZetaDia.Globals.IsLoadingWorld) { return(false); } if (DateTime.UtcNow.Subtract(_lastEquipCheckTime).TotalSeconds < 5) { return(false); } if (!ZetaDia.Me.IsValid || !ZetaDia.Me.CommonData.IsValid || ZetaDia.Me.CommonData.IsDisposed || ZetaDia.Me.Level == 0 || ZetaDia.Me.Level >= 70 && Core.Settings.Items.AutoEquipAutoDisable) { return(false); } if (_lastFreeBackpackSlots == Core.Player.FreeBackpackSlots) { return(false); } await IdentifyLegendaries(); Reset(); _equippedItems = new Dictionary <InventorySlot, CachedACDItem>(); foreach (var item in InventoryManager.Equipped) { // DB's Inventory Equipped collection sometimes gets messed up and has duplicate items. if (_equippedItems.ContainsKey(item.InventorySlot)) { continue; } _equippedItems.Add(item.InventorySlot, CachedACDItem.GetTrinityItem(item)); } _upgrades = _slots.ToDictionary(k => k, v => default(CachedACDItem)); foreach (var slot in _slots) { CachedACDItem currentlyEquipped; if (!_equippedItems.TryGetValue(slot, out currentlyEquipped)) { _equippedItems.Add(slot, null); } var backpackItems = GetBackpackItemsForSlot(slot); if (backpackItems == null) { continue; } Core.Logger.Verbose("{0}: {1}, Weight={2}", slot, currentlyEquipped != null ? currentlyEquipped.RealName : "None", GetWeight(currentlyEquipped)); foreach (var backpackItem in backpackItems) { if (backpackItem.AcdItem.InventorySlot != InventorySlot.BackpackItems) { continue; } // Dont use a 2hander in some situations. if (backpackItem.TwoHanded && ( Core.Player.ActorClass == ActorClass.Crusader || // Crusader uses shield bash ability to level. Core.Player.ActorClass == ActorClass.DemonHunter && !backpackItem.IsClassItem)) { continue; } var bestUpgradeFoundSoFar = _upgrades[slot]; if (IsUpgrade(backpackItem, currentlyEquipped, bestUpgradeFoundSoFar)) { _upgrades[slot] = backpackItem; } } } Core.Logger.Log("Item Evaluation {0} Equipped, {1} Backpack Candidates, {2} Upgrades found", _equippedItems.Count(i => i.Value != null), BackpackEquipment.Count(), _upgrades.Count(i => i.Value != null)); foreach (var upgrade in _upgrades) { if (upgrade.Value == null) { continue; } //if (upgrade.Key == InventorySlot.LeftHand && upgrade.Value.TwoHanded) //{ // var offhand = _equippedItems[InventorySlot.RightHand]; // if (offhand != null) // UnequipItem(offhand); //} await EquipItem(upgrade.Value.AcdItem, upgrade.Key); await Coroutine.Sleep(500); } _lastEquipCheckTime = DateTime.UtcNow; _lastFreeBackpackSlots = Core.Player.FreeBackpackSlots; await EquipWeaponSocket(); await EquipArmorSockets(); return(false); }