예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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);
        }