Exemple #1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        internal static bool ItemRulesPickupValidation(PickupItem item)
        {
            if (StashRule == null)
                StashRule = new Interpreter();

            Interpreter.InterpreterAction action = StashRule.checkPickUpItem(item, ItemEvaluationType.PickUp);

            switch (action)
            {
                case Interpreter.InterpreterAction.PICKUP:
                    return true;

                case Interpreter.InterpreterAction.IGNORE:
                    return false;
            }

            // TODO: remove if tested
            if (item.Quality > ItemQuality.Superior)
                Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "Item Rules doesn't handle {0} of type {1} and quality {2}!", item.Name, item.DBItemType, item.Quality);

            return PickupItemValidation(item);
        }
        internal void AppendDroppedItem(PickupItem item)
        {
            bool pickupItem;
            CacheData.PickupItem.TryGetValue(item.RActorGUID, out pickupItem);

            StringBuilder sb = new StringBuilder();

            sb.Append(FormatCSVField(item.ActorSNO));
            sb.Append(FormatCSVField(item.BalanceID));
            sb.Append(FormatCSVField(item.Name));
            sb.Append(FormatCSVField(item.InternalName));
            sb.Append(FormatCSVField(item.DBBaseType.ToString()));
            sb.Append(FormatCSVField(item.DBItemType.ToString()));
            sb.Append(FormatCSVField(item.TBaseType.ToString()));
            sb.Append(FormatCSVField(item.TType.ToString()));
            sb.Append(FormatCSVField(item.Quality.ToString()));
            sb.Append(FormatCSVField(item.Level));
            sb.Append(FormatCSVField(pickupItem));
            sb.Append("\n");

            _logItemQueue.Enqueue(sb.ToString());

        }
Exemple #3
0
        internal void AppendDroppedItem(PickupItem item)
        {
            bool pickupItem;

            CacheData.PickupItem.TryGetValue(item.RActorGUID, out pickupItem);

            StringBuilder sb = new StringBuilder();

            sb.Append(FormatCSVField(item.ActorSNO));
            sb.Append(FormatCSVField(item.BalanceID));
            sb.Append(FormatCSVField(item.Name));
            sb.Append(FormatCSVField(item.InternalName));
            sb.Append(FormatCSVField(item.DBBaseType.ToString()));
            sb.Append(FormatCSVField(item.DBItemType.ToString()));
            sb.Append(FormatCSVField(item.TBaseType.ToString()));
            sb.Append(FormatCSVField(item.TType.ToString()));
            sb.Append(FormatCSVField(item.Quality.ToString()));
            sb.Append(FormatCSVField(item.Level));
            sb.Append(FormatCSVField(pickupItem));
            sb.Append("\n");

            _logItemQueue.Enqueue(sb.ToString());
        }
Exemple #4
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="name"></param>
        /// <param name="level"></param>
        /// <param name="itemQuality"></param>
        /// <param name="itemBaseType"></param>
        /// <param name="itemType"></param>
        /// <param name="isOneHand"></param>
        /// <param name="isTwoHand"></param>
        /// <param name="gameBalanceId"></param>
        private void fillPickupDic(PickupItem item)
        {
            object result;
            itemDic = new Dictionary<string, object>();

            // add log unique key
            itemDic.Add("[KEY]", item.DynamicID.ToString());

            // - BASETYPE ---------------------------------------------------------//
            itemDic.Add("[BASETYPE]", item.DBBaseType.ToString());

            // - TYPE -------------------------------------------------------------//
            /// TODO remove this check if it isnt necessary anymore
            if (item.DBItemType == ItemType.Unknown && (item.Name.Contains("Plan") || item.Name.Contains("Design")))
            {
                Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "There are still buggy itemType infos for craftingPlan around {0} has itemType = {1}", item.Name, item.DBItemType);
                result = ItemType.CraftingPlan.ToString();
            }
            else result = item.DBItemType.ToString();
            itemDic.Add("[TYPE]", result);

            // - QUALITY -------------------------------------------------------//
            itemDic.Add("[QUALITY]", Regex.Replace(item.Quality.ToString(), @"[\d-]", string.Empty));
            itemDic.Add("[D3QUALITY]", item.Quality.ToString());

            // - ROLL ----------------------------------------------------------//
            float roll;
            if (float.TryParse(Regex.Replace(item.Quality.ToString(), @"[^\d]", string.Empty), out roll))
                itemDic.Add("[ROLL]", roll);
            else
                itemDic.Add("[ROLL]", 0f);

            // - NAME -------------------------------------------------------------//
            itemDic.Add("[NAME]", item.Name.ToString().Replace(" ", ""));

            // - LEVEL ------------------------------------------------------------//
            itemDic.Add("[LEVEL]", (float)item.Level);
            itemDic.Add("[ONEHAND]", item.IsOneHand);
            itemDic.Add("[TWOHAND]", item.IsTwoHand);
            itemDic.Add("[UNIDENT]", (bool)true);
            itemDic.Add("[INTNAME]", item.InternalName);
            itemDic.Add("[ITEMID]", item.BalanceID.ToString());
        }
Exemple #5
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        internal InterpreterAction checkPickUpItem(PickupItem item, ItemEvaluationType evaluationType)
        {
            fillPickupDic(item);

            return checkItem(evaluationType);
        }
Exemple #6
0
 public virtual bool Equals(PickupItem other)
 {
     return(DynamicID == other.DynamicID || GetHashCode() == other.GetHashCode());
 }
Exemple #7
0
        private static bool RefreshItem()
        {
            using (new PerformanceLogger("RefreshItem"))
            {
                bool logNewItem;
                bool AddToCache;

                var diaItem = c_diaObject as DiaItem;

                if (diaItem == null)
                    return false;

                if (diaItem.CommonData == null)
                    return false;

                if (!diaItem.IsValid)
                    return false;

                if (!diaItem.CommonData.IsValid)
                    return false;

                c_ItemQuality = diaItem.CommonData.ItemQualityLevel;
                ((DiaItem)c_diaObject).CommonData.GetAttribute<int>(ActorAttributeType.ItemQualityLevelIdentified);
                c_ItemDisplayName = diaItem.CommonData.Name;

                CurrentCacheObject.DynamicID = c_diaObject.CommonData.DynamicId;
                CurrentCacheObject.GameBalanceID = c_diaObject.CommonData.GameBalanceId;

                c_ItemLevel = diaItem.CommonData.Level;
                c_DBItemBaseType = diaItem.CommonData.ItemBaseType;
                c_DBItemType = diaItem.CommonData.ItemType;
                c_IsOneHandedItem = diaItem.CommonData.IsOneHand;
                c_IsTwoHandedItem = diaItem.CommonData.IsTwoHand;
                c_item_tFollowerType = diaItem.CommonData.FollowerSpecialType;

                // Calculate item type
                if(_cItemTinityItemType == TrinityItemType.Unknown)
                    _cItemTinityItemType = TrinityItemManager.DetermineItemType(CurrentCacheObject.InternalName, c_DBItemType, c_item_tFollowerType);

                // And temporarily store the base type
                TrinityItemBaseType itemBaseType = TrinityItemManager.DetermineBaseType(_cItemTinityItemType);

                // Compute item quality from item link 
                if (!CacheData.ItemLinkQuality.TryGetValue(CurrentCacheObject.ACDGuid, out c_ItemQuality))
                {
                    c_ItemQuality = diaItem.CommonData.GetItemQuality();
                    CacheData.ItemLinkQuality.Add(CurrentCacheObject.ACDGuid, c_ItemQuality);
                }

                if (itemBaseType == TrinityItemBaseType.Gem)
                    c_ItemLevel = (int)diaItem.CommonData.GemQuality;

                CurrentCacheObject.ObjectHash = HashGenerator.GenerateItemHash(
                    CurrentCacheObject.Position,
                    CurrentCacheObject.ActorSNO,
                    CurrentCacheObject.InternalName,
                    Player.WorldID,
                    c_ItemQuality,
                    c_ItemLevel);

                try
                {
                    c_IsAncient = c_ItemQuality == ItemQuality.Legendary && diaItem.CommonData.GetAttribute<int>(ActorAttributeType.AncientRank) > 0;
                }
                catch {}

                float range = 0f;

                // no range check on Legendaries
                if (c_ItemQuality < ItemQuality.Legendary || _cItemTinityItemType == TrinityItemType.ProgressionGlobe || _cItemTinityItemType == TrinityItemType.HoradricRelic)
                {
                    if (c_ItemQuality >= ItemQuality.Rare4)
                        range = CurrentBotLootRange;

                    if (_keepLootRadiusExtendedForSeconds > 0)
                        range += 90f;

                    if (CurrentCacheObject.Distance > (CurrentBotLootRange + range))
                    {
                        c_IgnoreSubStep = "OutOfRange";
                        // return here to save CPU on reading unncessary attributes for out of range items;
                        return false;
                    }
                }

                var pickupItem = new PickupItem
                {
                    Name = c_ItemDisplayName,
                    InternalName = CurrentCacheObject.InternalName,
                    Level = c_ItemLevel,
                    Quality = c_ItemQuality,
                    BalanceID = CurrentCacheObject.GameBalanceID,
                    DBBaseType = c_DBItemBaseType,
                    DBItemType = c_DBItemType,
                    TBaseType = itemBaseType,
                    TType = _cItemTinityItemType,
                    IsOneHand = c_IsOneHandedItem,
                    IsTwoHand = c_IsTwoHandedItem,
                    ItemFollowerType = c_item_tFollowerType,
                    DynamicID = CurrentCacheObject.DynamicID,
                    Position = CurrentCacheObject.Position,
                    ActorSNO = CurrentCacheObject.ActorSNO,
                    ACDGuid = CurrentCacheObject.ACDGuid,
                    RActorGUID = CurrentCacheObject.RActorGuid,
                };

                // Blood Shards == HoradricRelic
                if (_cItemTinityItemType == TrinityItemType.HoradricRelic && ZetaDia.CPlayer.BloodshardCount >= Player.MaxBloodShards)
                {
                    return false;
                }

                // Treat all globes as a yes
                if (_cItemTinityItemType == TrinityItemType.HealthGlobe)
                {
                    CurrentCacheObject.Type = TrinityObjectType.HealthGlobe;
                    return true;
                }

                // Treat all globes as a yes
                if (_cItemTinityItemType == TrinityItemType.PowerGlobe)
                {
                    CurrentCacheObject.Type = TrinityObjectType.PowerGlobe;
                    return true;
                }

                // Treat all globes as a yes
                if (_cItemTinityItemType == TrinityItemType.ProgressionGlobe)
                {
                    CurrentCacheObject.Type = TrinityObjectType.ProgressionGlobe;
                    return true;
                }

                // Item stats
                logNewItem = RefreshItemStats(itemBaseType);

                // Get whether or not we want this item, cached if possible
                if (!CacheData.PickupItem.TryGetValue(CurrentCacheObject.RActorGuid, out AddToCache))
                {
                    if (pickupItem.IsTwoHand && Settings.Loot.Pickup.IgnoreTwoHandedWeapons && c_ItemQuality < ItemQuality.Legendary)
                    {
                        AddToCache = false;
                    }
                    else if (Settings.Loot.ItemFilterMode == ItemFilterMode.DemonBuddy)
                    {
                        AddToCache = ItemManager.Current.ShouldPickUpItem((ACDItem)c_diaObject.CommonData);
                    }
                    else if (Settings.Loot.ItemFilterMode == ItemFilterMode.TrinityWithItemRules)
                    {
                        AddToCache = TrinityItemManager.ItemRulesPickupValidation(pickupItem);
                    }
                    else // Trinity Scoring Only
                    {
                        AddToCache = TrinityItemManager.PickupItemValidation(pickupItem);
                    }

                    // Pickup low level enabled, and we're a low level
                    if (!AddToCache && Settings.Loot.Pickup.PickupLowLevel && Player.Level <= 10)
                    {
                        AddToCache = TrinityItemManager.PickupItemValidation(pickupItem);
                    }

                    // Ignore if item has existed before in this location
                    if (Settings.Loot.TownRun.DropLegendaryInTown)
                    {
                        if (!CacheData.DroppedItems.Any(i => i.Equals(pickupItem)))
                        {
                            CacheData.DroppedItems.Add(pickupItem);
                            AddToCache = true;
                        }
                        else
                        {
                            Logger.LogDebug("Ignoring Dropped Item = ItemPosition={0} Hashcode={1} DynId={2}", pickupItem.Position, pickupItem.GetHashCode(), pickupItem.DynamicID);
                            AddToCache = false;
                        }
                            
                    }

                    CacheData.PickupItem.Add(CurrentCacheObject.RActorGuid, AddToCache);
                }

                if (AddToCache && ForceVendorRunASAP)
                    c_IgnoreSubStep = "ForcedVendoring";

                // Didn't pass pickup rules, so ignore it
                if (!AddToCache && c_IgnoreSubStep == String.Empty)
                    c_IgnoreSubStep = "NoMatchingRule";

                if (Settings.Advanced.LogDroppedItems && logNewItem && _cItemTinityItemType != TrinityItemType.HealthGlobe && _cItemTinityItemType != TrinityItemType.HealthPotion && _cItemTinityItemType != TrinityItemType.PowerGlobe && _cItemTinityItemType != TrinityItemType.ProgressionGlobe)
                    //LogDroppedItem();
                    ItemDroppedAppender.Instance.AppendDroppedItem(pickupItem);

                return AddToCache;
            }
        }
Exemple #8
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        internal static bool PickupItemValidation(PickupItem item)
        {
            // Calculate item types and base types etc.
            GItemType itemType = DetermineItemType(item.InternalName, item.DBItemType, item.ItemFollowerType);
            GItemBaseType baseType = DetermineBaseType(itemType);

            // Pickup Ramaladni's Gift
            if (itemType == GItemType.ConsumableAddSockets)
            {
                return true;
            }

            // Tiered Rift Keys
            if (itemType == GItemType.TieredLootrunKey)
            {
                return true;
            }

            // Pickup Legendary potions
            if (itemType == GItemType.HealthPotion && item.Quality >= ItemQuality.Legendary)
            {
                return true;
            }

            if (itemType == GItemType.InfernalKey)
            {
                return Settings.Loot.Pickup.InfernalKeys;
            }

            // Rift Keystone Fragments == LootRunkey
            if (itemType == GItemType.LootRunKey)
            {
                return Settings.Loot.Pickup.LootRunKey;
            }

            // Blood Shards == HoradricRelic
            if (itemType == GItemType.HoradricRelic && ZetaDia.CPlayer.BloodshardCount < 500)
            {
                return Settings.Loot.Pickup.BloodShards;
            }

            if (itemType == GItemType.CraftingMaterial && (item.ACDItem.GetTrinityItemQuality() < Settings.Loot.Pickup.MiscItemQuality || !Settings.Loot.Pickup.CraftMaterials))
            {
                return false;
            }

            // Plans
            if (item.InternalName.ToLower().StartsWith("craftingplan_smith") && (item.ACDItem.GetTrinityItemQuality() < Settings.Loot.Pickup.MiscItemQuality || !Settings.Loot.Pickup.Plans))
            {
                return false;
            }

            // Designs
            if (item.InternalName.ToLower().StartsWith("craftingplan_jeweler") && (item.ACDItem.GetTrinityItemQuality() < Settings.Loot.Pickup.MiscItemQuality || !Settings.Loot.Pickup.Designs))
            {
                return false;
            }

            // Always pickup Legendary plans
            if (itemType == GItemType.CraftingPlan && item.Quality >= ItemQuality.Legendary && Settings.Loot.Pickup.LegendaryPlans)
            {
                return true;
            }
            // If it's legendary, we always want it *IF* it's level is right
            if (item.Quality >= ItemQuality.Legendary)
            {
                return (Settings.Loot.Pickup.LegendaryLevel > 0 && (item.Level >= Settings.Loot.Pickup.LegendaryLevel || Settings.Loot.Pickup.LegendaryLevel == 1));
            }

            if (item.IsUpgrade && Settings.Loot.Pickup.PickupUpgrades)
            {
                return true;
            }

            switch (baseType)
            {
                case GItemBaseType.WeaponTwoHand:
                case GItemBaseType.WeaponOneHand:
                case GItemBaseType.WeaponRange:
                    return CheckLevelRequirements(item.Level, item.Quality, Settings.Loot.Pickup.WeaponBlueLevel, Settings.Loot.Pickup.WeaponYellowLevel);
                case GItemBaseType.Armor:
                case GItemBaseType.Offhand:
                    return CheckLevelRequirements(item.Level, item.Quality, Settings.Loot.Pickup.ArmorBlueLevel, Settings.Loot.Pickup.ArmorYellowLevel);
                case GItemBaseType.Jewelry:
                    return CheckLevelRequirements(item.Level, item.Quality, Settings.Loot.Pickup.JewelryBlueLevel, Settings.Loot.Pickup.JewelryYellowLevel);
                case GItemBaseType.FollowerItem:
                    if (item.Quality >= ItemQuality.Legendary)
                    {
                        return true;
                    }
                    if (item.Quality >= ItemQuality.Magic1 && item.Quality <= ItemQuality.Magic3 && Settings.Loot.Pickup.PickupBlueFollowerItems)
                        return true;
                    if (item.Quality >= ItemQuality.Rare4 && item.Quality <= ItemQuality.Rare6 && Settings.Loot.Pickup.PickupYellowFollowerItems)
                        return true;
                    // not matched above, ignore it
                    return false;
                case GItemBaseType.Gem:
                    if (item.Level < Settings.Loot.Pickup.GemLevel ||
                        (itemType == GItemType.Ruby && !Settings.Loot.Pickup.GemType.HasFlag(TrinityGemType.Ruby)) ||
                        (itemType == GItemType.Emerald && !Settings.Loot.Pickup.GemType.HasFlag(TrinityGemType.Emerald)) ||
                        (itemType == GItemType.Amethyst && !Settings.Loot.Pickup.GemType.HasFlag(TrinityGemType.Amethyst)) ||
                        (itemType == GItemType.Topaz && !Settings.Loot.Pickup.GemType.HasFlag(TrinityGemType.Topaz)) ||
                        (itemType == GItemType.Diamond && !Settings.Loot.Pickup.GemType.HasFlag(TrinityGemType.Diamond)))
                    {
                        return false;
                    }
                    break;
                case GItemBaseType.Misc:

                    // Potion filtering
                    if (itemType == GItemType.HealthPotion && item.Quality < ItemQuality.Legendary)
                    {
                        int potionsInBackPack = ZetaDia.Me.Inventory.Backpack.Where(p => p.ItemType == ItemType.Potion).Sum(p => p.ItemStackQuantity);

                        if (potionsInBackPack >= Settings.Loot.Pickup.PotionCount)
                            return false;
                        else
                            return true;
                    }
                    break;
                case GItemBaseType.HealthGlobe:
                    return true;
                case GItemBaseType.ProgressionGlobe:
                    return true;
                case GItemBaseType.Unknown:
                    return false;
                default:
                    return false;
            }

            // Didn't cancel it, so default to true!
            return true;
        }
Exemple #9
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 internal static bool IdentifyItemValidation(PickupItem item)
 {
     if (Trinity.Settings.Loot.TownRun.KeepLegendaryUnid)
         return false;
     else
         return true;
 }
Exemple #10
0
        internal static bool ItemRulesIdentifyValidation(ACDItem item)
        {
            ItemEvents.ResetTownRun();
            PickupItem pickupItem = new PickupItem(
                                       item.Name,
                                       item.InternalName,
                                       item.Level,
                                       item.ItemQualityLevel,
                                       item.GameBalanceId,
                                       item.ItemBaseType,
                                       item.ItemType,
                                       item.IsOneHand,
                                       item.IsTwoHand,
                                       item.FollowerSpecialType,
                                       item.ACDGuid,
                                       item.DynamicId);

            Logger.Log(TrinityLogLevel.Info, LogCategory.ItemValuation,
                "Incoming Identification Request: {0}, {1}, {2}, {3}, {4}",
                pickupItem.Quality, pickupItem.Level, pickupItem.DBBaseType,
                pickupItem.DBItemType, pickupItem.IsOneHand ? "1H" : pickupItem.IsTwoHand ? "2H" : "NH");

            if (Trinity.StashRule != null)
            {

                // using ItemEvaluationType.Identify isn't available so we are abusing Sell for that manner
                Interpreter.InterpreterAction action = Trinity.StashRule.checkPickUpItem(pickupItem, ItemEvaluationType.Sell);

                Logger.Log(TrinityLogLevel.Debug, LogCategory.ItemValuation, "Action is: {0}", action);

                switch (action)
                {
                    case Interpreter.InterpreterAction.IDENTIFY:
                        return true;
                    case Interpreter.InterpreterAction.UNIDENT:
                        return false;
                    default:
                        Logger.Log(TrinityLogLevel.Info, LogCategory.ScriptRule, "Trinity, item is unhandled by ItemRules (Identification)!");
                        return IdentifyItemValidation(pickupItem);
                }
            }
            else
                return IdentifyItemValidation(pickupItem);

        }
Exemple #11
0
 public virtual bool Equals(PickupItem other)
 {
     return DynamicID == other.DynamicID || GetHashCode() == other.GetHashCode();
 }