Esempio n. 1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="item"></param>
        private void fillDic(ACDItem item)
        {
            object result;
            itemDic = new Dictionary<string, object>();

            // return if no item available
            if (item == null)
            {
                logOut("received an item with a null reference!", InterpreterAction.NULL, LogType.ERROR);
                return;
            }

            // check for missing translations
            if (Trinity.Settings.Loot.ItemRules.Debug && item.ItemQualityLevel == ItemQuality.Legendary)
                checkItemForMissingTranslation(item);

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

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

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

            // - QUALITY -------------------------------------------------------//
            //itemDic.Add("[QUALITY]", Regex.Replace(item.ItemQualityLevel.ToString(), @"[\d-]", string.Empty));
            itemDic.Add("[QUALITY]", Regex.Replace(item.ItemLinkColorQuality().ToString(), @"[\d-]", string.Empty));
            itemDic.Add("[D3QUALITY]", item.ItemQualityLevel.ToString());
            itemDic.Add("[SET]", isSet(item));
            itemDic.Add("[SETNAME]", inSet(item).Replace(" ", "")); //remove spaces to appease the parser Gods <== For use in Macros
            itemDic.Add("[SETFULLNAME]", inSet(item));

            // - ROLL ----------------------------------------------------------//
            float roll;
            if (float.TryParse(Regex.Replace(item.ItemQualityLevel.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]", item.IsUnidentified);
            itemDic.Add("[INTNAME]", item.InternalName);
            itemDic.Add("[ITEMID]", item.GameBalanceId.ToString());
            itemDic.Add("[SNO]", item.ActorSNO);

            // if there are no stats return
            //if (item.Stats == null) return;

            itemDic.Add("[STR]", item.Stats.Strength);
            itemDic.Add("[DEX]", item.Stats.Dexterity);
            itemDic.Add("[INT]", item.Stats.Intelligence);
            itemDic.Add("[VIT]", item.Stats.Vitality);
            itemDic.Add("[AS%]", item.Stats.AttackSpeedPercent > 0 ? item.Stats.AttackSpeedPercent : item.Stats.AttackSpeedPercentBonus);
            itemDic.Add("[MS%]", item.Stats.MovementSpeed);
            itemDic.Add("[LIFE%]", item.Stats.LifePercent);
            itemDic.Add("[LS%]", item.Stats.LifeSteal);
            itemDic.Add("[LOH]", item.Stats.LifeOnHit);
            itemDic.Add("[LOK]", item.Stats.LifeOnKill);
            itemDic.Add("[REGEN]", item.Stats.HealthPerSecond);
            itemDic.Add("[GLOBEBONUS]", item.Stats.HealthGlobeBonus);
            itemDic.Add("[DPS]", item.Stats.WeaponDamagePerSecond);
            itemDic.Add("[WEAPAS]", item.Stats.WeaponAttacksPerSecond);
            itemDic.Add("[WEAPDMGTYPE]", item.Stats.WeaponDamageType.ToString());
            itemDic.Add("[WEAPMAXDMG]", item.Stats.WeaponMaxDamage);
            itemDic.Add("[WEAPMINDMG]", item.Stats.WeaponMinDamage);
            itemDic.Add("[CRIT%]", item.Stats.CritPercent);
            itemDic.Add("[CRITDMG%]", item.Stats.CritDamagePercent);
            itemDic.Add("[BLOCK%]", item.Stats.BlockChanceBonus);
            itemDic.Add("[MINDMG]", item.Stats.MinDamage);
            itemDic.Add("[MAXDMG]", item.Stats.MaxDamage);
            itemDic.Add("[ALLRES]", item.Stats.ResistAll);
            itemDic.Add("[RESPHYSICAL]", item.Stats.ResistPhysical);
            itemDic.Add("[RESFIRE]", item.Stats.ResistFire);
            itemDic.Add("[RESLIGHTNING]", item.Stats.ResistLightning);
            itemDic.Add("[RESHOLY]", item.Stats.ResistHoly);
            itemDic.Add("[RESARCANE]", item.Stats.ResistArcane);
            itemDic.Add("[RESCOLD]", item.Stats.ResistCold);
            itemDic.Add("[RESPOISON]", item.Stats.ResistPoison);
            itemDic.Add("[ARMOR]", item.Stats.Armor);
            itemDic.Add("[ARMORBONUS]", item.Stats.ArmorBonus);
            itemDic.Add("[ARMORTOT]", item.Stats.ArmorTotal);
            itemDic.Add("[GF%]", item.Stats.GoldFind);
            itemDic.Add("[MF%]", item.Stats.MagicFind);
            itemDic.Add("[PICKRAD]", item.Stats.PickUpRadius);
            itemDic.Add("[SOCKETS]", (float)item.Stats.Sockets);
            itemDic.Add("[THORNS]", item.Stats.Thorns);
            itemDic.Add("[DMGREDPHYSICAL]", item.Stats.DamageReductionPhysicalPercent);
            itemDic.Add("[MAXARCPOWER]", item.Stats.MaxArcanePower);
            itemDic.Add("[HEALTHSPIRIT]", item.Stats.HealthPerSpiritSpent);
            itemDic.Add("[MAXSPIRIT]", item.Stats.MaxSpirit);
            itemDic.Add("[SPIRITREG]", item.Stats.SpiritRegen);
            itemDic.Add("[ARCONCRIT]", item.Stats.ArcaneOnCrit);
            itemDic.Add("[MAXFURY]", item.Stats.MaxFury);
            itemDic.Add("[MAXDISCIP]", item.Stats.MaxDiscipline);
            itemDic.Add("[HATREDREG]", item.Stats.HatredRegen);
            itemDic.Add("[MAXMANA]", item.Stats.MaxMana);
            itemDic.Add("[MANAREG]", item.Stats.ManaRegen);

            itemDic.Add("[ANCIENT]", (float)item.AncientRank);

            // - ROS & MORE STATS ADDED -------------------------------------------//
            // This include Splash Damage, Cooldown Reduction, Resource Cost
            // Reduction, +% damage to Physical damage skills, and specific Class
            // Skill Bonuses
            itemDic.Add("[SLOWPROC%]", item.Stats.WeaponOnHitSlowProcChance);
            itemDic.Add("[BLINDPROC%]", item.Stats.WeaponOnHitBlindProcChance);
            itemDic.Add("[CHILLPROC%]", item.Stats.WeaponOnHitChillProcChance);
            itemDic.Add("[FEARPROC%]", item.Stats.WeaponOnHitFearProcChance);
            itemDic.Add("[FREEZEPROC%]", item.Stats.WeaponOnHitFreezeProcChance);
            itemDic.Add("[IMMOPROC%]", item.Stats.WeaponOnHitImmobilizeProcChance);
            itemDic.Add("[KNOCKPROC%]", item.Stats.WeaponOnHitKnockbackProcChance);
            itemDic.Add("[BLEEDPROC%]", item.Stats.WeaponOnHitBleedProcChance);

            itemDic.Add("[AREADMGPROC%]", item.Stats.OnHitAreaDamageProcChance);

            itemDic.Add("[CDRED%]", item.Stats.PowerCooldownReductionPercent);
            itemDic.Add("[RESRED%]", item.Stats.ResourceCostReductionPercent);

            itemDic.Add("[FIREDMG%]", item.Stats.FireSkillDamagePercentBonus);
            itemDic.Add("[LIGHTNINGDMG%]", item.Stats.LightningSkillDamagePercentBonus);
            itemDic.Add("[COLDDMG%]", item.Stats.ColdSkillDamagePercentBonus);
            itemDic.Add("[POISONDMG%]", item.Stats.PosionSkillDamagePercentBonus);
            itemDic.Add("[ARCANEDMG%]", item.Stats.ArcaneSkillDamagePercentBonus);
            itemDic.Add("[HOLYDMG%]", item.Stats.HolySkillDamagePercentBonus);

            itemDic.Add("[PHYSDMG%]", item.Stats.PhysicalSkillDamagePercentBonus);

            itemDic.Add("[ELEMDMG%]", new float[] { item.Stats.FireSkillDamagePercentBonus,
                                                    item.Stats.LightningSkillDamagePercentBonus,
                                                    item.Stats.ColdSkillDamagePercentBonus,
                                                    item.Stats.PosionSkillDamagePercentBonus,
                                                    item.Stats.ArcaneSkillDamagePercentBonus,
                                                    item.Stats.HolySkillDamagePercentBonus,
                                                    item.Stats.PhysicalSkillDamagePercentBonus }.Max());

            itemDic.Add("[SKILLDMG%]", ItemDataUtils.GetSkillDamagePercent(item));

            float damage, healing, toughness;
            item.GetStatChanges(out damage, out healing, out toughness);
            itemDic.Add("[UPDMG]", damage);
            itemDic.Add("[UPHEAL]", healing);
            itemDic.Add("[UPTOUGH]", toughness);

            // - NEW STATS ADDED --------------------------------------------------//
            itemDic.Add("[LEVELRED]", (float)item.Stats.ItemLevelRequirementReduction);
            itemDic.Add("[TOTBLOCK%]", item.Stats.BlockChance);
            itemDic.Add("[DMGVSELITE%]", item.Stats.DamagePercentBonusVsElites);
            itemDic.Add("[DMGREDELITE%]", item.Stats.DamagePercentReductionFromElites);
            itemDic.Add("[EXPBONUS]", item.Stats.ExperienceBonus);
            itemDic.Add("[REQLEVEL]", (float)item.Stats.RequiredLevel);
            itemDic.Add("[WEAPDMG%]", item.Stats.WeaponDamagePercent);

            itemDic.Add("[MAXSTAT]", new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max());
            itemDic.Add("[MAXSTATVIT]", new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max() + item.Stats.Vitality);
            itemDic.Add("[STRVIT]", item.Stats.Strength + item.Stats.Vitality);
            itemDic.Add("[DEXVIT]", item.Stats.Dexterity + item.Stats.Vitality);
            itemDic.Add("[INTVIT]", item.Stats.Intelligence + item.Stats.Vitality);
            itemDic.Add("[MAXONERES]", new float[] { item.Stats.ResistArcane, item.Stats.ResistCold, item.Stats.ResistFire, item.Stats.ResistHoly, item.Stats.ResistLightning, item.Stats.ResistPhysical, item.Stats.ResistPoison }.Max());
            itemDic.Add("[TOTRES]", item.Stats.ResistArcane + item.Stats.ResistCold + item.Stats.ResistFire + item.Stats.ResistHoly + item.Stats.ResistLightning + item.Stats.ResistPhysical + item.Stats.ResistPoison + item.Stats.ResistAll);
            itemDic.Add("[DMGFACTOR]", item.Stats.AttackSpeedPercent + item.Stats.CritPercent * 2 + item.Stats.CritDamagePercent / 5 + (item.Stats.MinDamage + item.Stats.MaxDamage) / 20);
            itemDic.Add("[AVGDMG]", (item.Stats.MinDamage + item.Stats.MaxDamage) / 2);

            float offstats = 0;
            //if (new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max() > 0)
            //    offstats += 1;
            if (item.Stats.CritPercent > 0)
                offstats += 1;
            if (item.Stats.CritDamagePercent > 0)
                offstats += 1;
            if (item.Stats.AttackSpeedPercent > 0)
                offstats += 1;
            if (item.Stats.MinDamage + item.Stats.MaxDamage > 0)
                offstats += 1;
            itemDic.Add("[OFFSTATS]", offstats);

            float defstats = 0;
            //if (item.Stats.Vitality > 0)
            defstats += 1;
            if (item.Stats.ResistAll > 0)
                defstats += 1;
            if (item.Stats.ArmorBonus > 0)
                defstats += 1;
            if (item.Stats.BlockChance > 0)
                defstats += 1;
            if (item.Stats.LifePercent > 0)
                defstats += 1;
            //if (item.Stats.HealthPerSecond > 0)
            //    defstats += 1;
            itemDic.Add("[DEFSTATS]", defstats);
            itemDic.Add("[WEIGHTS]", WeightSet.CurrentWeightSet.EvaluateItem(item));

            //itemDic.Add("[GAMEBALANCEID]", (float)item.GameBalanceId);
            //itemDic.Add("[DYNAMICID]", item.DynamicId);

            // starting on macro implementation here
            foreach (string key in macroDic.Keys)
            {
                ParseErrors parseErrors = null;
                string expr = macroDic[key];
                try
                {
                    object exprValue = evaluateExpr(expr, out parseErrors);
                    itemDic.Add("[" + key + "]", exprValue);
                }
                catch (Exception e)
                {
                    logOut(e.Message
                        + SEP + "last use rule: " + expr
                        + SEP + getParseErrors(parseErrors)
                        + SEP + getFullItem()
                        + SEP + e.ToString()
                        , InterpreterAction.NULL, LogType.ERROR);
                }
            }

            // end macro implementation
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="item"></param>
        private void fillDic(ACDItem item)
        {
            object result;

            itemDic = new Dictionary <string, object>();

            // return if no item available
            if (item == null)
            {
                logOut("received an item with a null reference!", InterpreterAction.NULL, LogType.ERROR);
                return;
            }

            // check for missing translations
            if (Trinity.Settings.Loot.ItemRules.Debug && item.ItemQualityLevel == ItemQuality.Legendary)
            {
                checkItemForMissingTranslation(item);
            }

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

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

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

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

            // - ROLL ----------------------------------------------------------//
            float roll;

            if (float.TryParse(Regex.Replace(item.ItemQualityLevel.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]", item.IsUnidentified);
            itemDic.Add("[INTNAME]", item.InternalName);
            itemDic.Add("[ITEMID]", item.GameBalanceId.ToString());

            // if there are no stats return
            //if (item.Stats == null) return;

            itemDic.Add("[STR]", item.Stats.Strength);
            itemDic.Add("[DEX]", item.Stats.Dexterity);
            itemDic.Add("[INT]", item.Stats.Intelligence);
            itemDic.Add("[VIT]", item.Stats.Vitality);
            itemDic.Add("[AS%]", item.Stats.AttackSpeedPercent > 0 ? item.Stats.AttackSpeedPercent : item.Stats.AttackSpeedPercentBonus);
            itemDic.Add("[MS%]", item.Stats.MovementSpeed);
            itemDic.Add("[LIFE%]", item.Stats.LifePercent);
            itemDic.Add("[LS%]", item.Stats.LifeSteal);
            itemDic.Add("[LOH]", item.Stats.LifeOnHit);
            itemDic.Add("[LOK]", item.Stats.LifeOnKill);
            itemDic.Add("[REGEN]", item.Stats.HealthPerSecond);
            itemDic.Add("[GLOBEBONUS]", item.Stats.HealthGlobeBonus);
            itemDic.Add("[DPS]", item.Stats.WeaponDamagePerSecond);
            itemDic.Add("[WEAPAS]", item.Stats.WeaponAttacksPerSecond);
            itemDic.Add("[WEAPDMGTYPE]", item.Stats.WeaponDamageType.ToString());
            itemDic.Add("[WEAPMAXDMG]", item.Stats.WeaponMaxDamage);
            itemDic.Add("[WEAPMINDMG]", item.Stats.WeaponMinDamage);
            itemDic.Add("[CRIT%]", item.Stats.CritPercent);
            itemDic.Add("[CRITDMG%]", item.Stats.CritDamagePercent);
            itemDic.Add("[BLOCK%]", item.Stats.BlockChanceBonus);
            itemDic.Add("[MINDMG]", item.Stats.MinDamage);
            itemDic.Add("[MAXDMG]", item.Stats.MaxDamage);
            itemDic.Add("[ALLRES]", item.Stats.ResistAll);
            itemDic.Add("[RESPHYSICAL]", item.Stats.ResistPhysical);
            itemDic.Add("[RESFIRE]", item.Stats.ResistFire);
            itemDic.Add("[RESLIGHTNING]", item.Stats.ResistLightning);
            itemDic.Add("[RESHOLY]", item.Stats.ResistHoly);
            itemDic.Add("[RESARCANE]", item.Stats.ResistArcane);
            itemDic.Add("[RESCOLD]", item.Stats.ResistCold);
            itemDic.Add("[RESPOISON]", item.Stats.ResistPoison);
            itemDic.Add("[ARMOR]", item.Stats.Armor);
            itemDic.Add("[ARMORBONUS]", item.Stats.ArmorBonus);
            itemDic.Add("[ARMORTOT]", item.Stats.ArmorTotal);
            itemDic.Add("[GF%]", item.Stats.GoldFind);
            itemDic.Add("[MF%]", item.Stats.MagicFind);
            itemDic.Add("[PICKRAD]", item.Stats.PickUpRadius);
            itemDic.Add("[SOCKETS]", (float)item.Stats.Sockets);
            itemDic.Add("[THORNS]", item.Stats.Thorns);
            itemDic.Add("[DMGREDPHYSICAL]", item.Stats.DamageReductionPhysicalPercent);
            itemDic.Add("[MAXARCPOWER]", item.Stats.MaxArcanePower);
            itemDic.Add("[HEALTHSPIRIT]", item.Stats.HealthPerSpiritSpent);
            itemDic.Add("[MAXSPIRIT]", item.Stats.MaxSpirit);
            itemDic.Add("[SPIRITREG]", item.Stats.SpiritRegen);
            itemDic.Add("[ARCONCRIT]", item.Stats.ArcaneOnCrit);
            itemDic.Add("[MAXFURY]", item.Stats.MaxFury);
            itemDic.Add("[MAXDISCIP]", item.Stats.MaxDiscipline);
            itemDic.Add("[HATREDREG]", item.Stats.HatredRegen);
            itemDic.Add("[MAXMANA]", item.Stats.MaxMana);
            itemDic.Add("[MANAREG]", item.Stats.ManaRegen);

            // - ROS & MORE STATS ADDED -------------------------------------------//
            // This include Splash Damage, Cooldown Reduction, Resource Cost
            // Reduction, +% damage to Physical damage skills, and specific Class
            // Skill Bonuses
            itemDic.Add("[SLOWPROC%]", item.Stats.WeaponOnHitSlowProcChance);
            itemDic.Add("[BLINDPROC%]", item.Stats.WeaponOnHitBlindProcChance);
            itemDic.Add("[CHILLPROC%]", item.Stats.WeaponOnHitChillProcChance);
            itemDic.Add("[FEARPROC%]", item.Stats.WeaponOnHitFearProcChance);
            itemDic.Add("[FREEZEPROC%]", item.Stats.WeaponOnHitFreezeProcChance);
            itemDic.Add("[IMMOPROC%]", item.Stats.WeaponOnHitImmobilizeProcChance);
            itemDic.Add("[KNOCKPROC%]", item.Stats.WeaponOnHitKnockbackProcChance);
            itemDic.Add("[BLEEDPROC%]", item.Stats.WeaponOnHitBleedProcChance);

            itemDic.Add("[AREADMGPROC%]", item.Stats.OnHitAreaDamageProcChance);

            itemDic.Add("[CDRED%]", item.Stats.PowerCooldownReductionPercent);
            itemDic.Add("[RESRED%]", item.Stats.ResourceCostReductionPercent);

            itemDic.Add("[FIREDMG%]", item.Stats.FireSkillDamagePercentBonus);
            itemDic.Add("[LIGHTNINGDMG%]", item.Stats.LightningSkillDamagePercentBonus);
            itemDic.Add("[COLDDMG%]", item.Stats.ColdSkillDamagePercentBonus);
            itemDic.Add("[POISONDMG%]", item.Stats.PosionSkillDamagePercentBonus);
            itemDic.Add("[ARCANEDMG%]", item.Stats.ArcaneSkillDamagePercentBonus);
            itemDic.Add("[HOLYDMG%]", item.Stats.HolySkillDamagePercentBonus);

            itemDic.Add("[PHYSDMG%]", item.Stats.SkillDamagePercentBonus);

            itemDic.Add("[ELEMDMG%]", new float[] { item.Stats.FireSkillDamagePercentBonus,
                                                    item.Stats.LightningSkillDamagePercentBonus,
                                                    item.Stats.ColdSkillDamagePercentBonus,
                                                    item.Stats.PosionSkillDamagePercentBonus,
                                                    item.Stats.ArcaneSkillDamagePercentBonus,
                                                    item.Stats.HolySkillDamagePercentBonus }.Max());

            itemDic.Add("[SKILLDMG%]", new float[] { item.Stats.FireSkillDamagePercentBonus,
                                                     item.Stats.LightningSkillDamagePercentBonus,
                                                     item.Stats.ColdSkillDamagePercentBonus,
                                                     item.Stats.PosionSkillDamagePercentBonus,
                                                     item.Stats.ArcaneSkillDamagePercentBonus,
                                                     item.Stats.HolySkillDamagePercentBonus,
                                                     item.Stats.SkillDamagePercentBonus }.Max());

            float damage, healing, toughness;

            item.GetStatChanges(out damage, out healing, out toughness);
            itemDic.Add("[UPDMG]", damage);
            itemDic.Add("[UPHEAL]", healing);
            itemDic.Add("[UPTOUGH]", toughness);

            // - NEW STATS ADDED --------------------------------------------------//
            itemDic.Add("[LEVELRED]", (float)item.Stats.ItemLevelRequirementReduction);
            itemDic.Add("[TOTBLOCK%]", item.Stats.BlockChance);
            itemDic.Add("[DMGVSELITE%]", item.Stats.DamagePercentBonusVsElites);
            itemDic.Add("[DMGREDELITE%]", item.Stats.DamagePercentReductionFromElites);
            itemDic.Add("[EXPBONUS]", item.Stats.ExperienceBonus);
            itemDic.Add("[REQLEVEL]", (float)item.Stats.RequiredLevel);
            itemDic.Add("[WEAPDMG%]", item.Stats.WeaponDamagePercent);

            itemDic.Add("[MAXSTAT]", new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max());
            itemDic.Add("[MAXSTATVIT]", new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max() + item.Stats.Vitality);
            itemDic.Add("[STRVIT]", item.Stats.Strength + item.Stats.Vitality);
            itemDic.Add("[DEXVIT]", item.Stats.Dexterity + item.Stats.Vitality);
            itemDic.Add("[INTVIT]", item.Stats.Intelligence + item.Stats.Vitality);
            itemDic.Add("[MAXONERES]", new float[] { item.Stats.ResistArcane, item.Stats.ResistCold, item.Stats.ResistFire, item.Stats.ResistHoly, item.Stats.ResistLightning, item.Stats.ResistPhysical, item.Stats.ResistPoison }.Max());
            itemDic.Add("[TOTRES]", item.Stats.ResistArcane + item.Stats.ResistCold + item.Stats.ResistFire + item.Stats.ResistHoly + item.Stats.ResistLightning + item.Stats.ResistPhysical + item.Stats.ResistPoison + item.Stats.ResistAll);
            itemDic.Add("[DMGFACTOR]", item.Stats.AttackSpeedPercent + item.Stats.CritPercent * 2 + item.Stats.CritDamagePercent / 5 + (item.Stats.MinDamage + item.Stats.MaxDamage) / 20);
            itemDic.Add("[AVGDMG]", (item.Stats.MinDamage + item.Stats.MaxDamage) / 2);

            float offstats = 0;

            //if (new float[] { item.Stats.Strength, item.Stats.Intelligence, item.Stats.Dexterity }.Max() > 0)
            //    offstats += 1;
            if (item.Stats.CritPercent > 0)
            {
                offstats += 1;
            }
            if (item.Stats.CritDamagePercent > 0)
            {
                offstats += 1;
            }
            if (item.Stats.AttackSpeedPercent > 0)
            {
                offstats += 1;
            }
            if (item.Stats.MinDamage + item.Stats.MaxDamage > 0)
            {
                offstats += 1;
            }
            itemDic.Add("[OFFSTATS]", offstats);

            float defstats = 0;

            //if (item.Stats.Vitality > 0)
            defstats += 1;
            if (item.Stats.ResistAll > 0)
            {
                defstats += 1;
            }
            if (item.Stats.ArmorBonus > 0)
            {
                defstats += 1;
            }
            if (item.Stats.BlockChance > 0)
            {
                defstats += 1;
            }
            if (item.Stats.LifePercent > 0)
            {
                defstats += 1;
            }
            //if (item.Stats.HealthPerSecond > 0)
            //    defstats += 1;
            itemDic.Add("[DEFSTATS]", defstats);
            itemDic.Add("[WEIGHTS]", WeightSet.CurrentWeightSet.EvaluateItem(item));

            //itemDic.Add("[GAMEBALANCEID]", (float)item.GameBalanceId);
            //itemDic.Add("[DYNAMICID]", item.DynamicId);

            // starting on macro implementation here
            foreach (string key in macroDic.Keys)
            {
                ParseErrors parseErrors = null;
                string      expr        = macroDic[key];
                try
                {
                    object exprValue = evaluateExpr(expr, out parseErrors);
                    itemDic.Add("[" + key + "]", exprValue);
                }
                catch (Exception e)
                {
                    logOut(e.Message
                           + SEP + "last use rule: " + expr
                           + SEP + getParseErrors(parseErrors)
                           + SEP + getFullItem()
                           + SEP + e.ToString()
                           , InterpreterAction.NULL, LogType.ERROR);
                }
            }

            // end macro implementation
        }
        public static bool ShouldEquipItem(InventorySlot slot, ACDItem acdItem)
        {
            ItemWrapper item = new ItemWrapper(acdItem);

            CheckedItems.Add(new Tuple <InventorySlot, int>(slot, item.ACDGuid));

            // Two handed weapons can never go into RightHand
            if (slot == InventorySlot.RightHand && item.IsTwoHand)
            {
                return(false);
            }

            if (!Settings.AllowTwoHand && item.IsTwoHand)
            {
                return(false);
            }

            if (!Settings.AllowShields && item.IsShield)
            {
                return(false);
            }

            if (!Settings.DualWield && item.IsOneHand && slot == InventorySlot.RightHand)
            {
                return(false);
            }

            if (Settings.DisableAt70 && Player.Level >= 70)
            {
                return(false);
            }

            if (IsSlotProtected(slot))
            {
                return(false);
            }

            // Is an equippable item type for our Hero?
            if (!Armory.ActiveHero.CanEquipItem(item, slot))
            {
                return(false);
            }

            // We meet the level requirements?
            // This shit is broken in DB/D3 memory reading. Between levels 61-70 it'll report weird numbers!
            //if (acdItem.Level > ZetaDia.Me.Level)
            //{
            //    Logger.Debug("We don't meet the level requirements for {0} ({1})", item.Name, acdItem.Level);
            //    return false;
            //}

            // Check if our slot is empty
            bool isSlotEmpty = ZetaDia.Me.Inventory.Equipped.All(i => i.InventorySlot != slot);

            bool isSlotDamaged = !isSlotEmpty && ZetaDia.Me.Inventory.Equipped.FirstOrDefault(i => i.InventorySlot == slot).DurabilityCurrent < 3;

            if (isSlotDamaged)
            {
                return(false);
            }

            if (isSlotEmpty && !item.IsShield && !Player.HasTwoHandEquipped)
            {
                Logger.Log("{0} is an Upgrade -  Slot is Empty", item.Name);
                return(true);
            }

            float damage, toughness, healing;

            Logger.Debug("Evaluating {0} - {1}", slot, item.Name);

            if (slot == InventorySlot.RightFinger)
            {
                // Alt item slot for Right Ring finger
                acdItem.GetStatChanges(out damage, out healing, out toughness, true);
            }
            else if (slot == InventorySlot.RightHand && !Player.HasTwoHandEquipped && (Player.IsDualWielding || isSlotEmpty))
            {
                // Alt Item Slot for Right Hand if dual wielding or slot is empty and no 2H equipped
                acdItem.GetStatChanges(out damage, out healing, out toughness, true);
            }
            else
            {
                acdItem.GetStatChanges(out damage, out healing, out toughness);
            }

            bool isUpgrade = CalculateUpgrade(damage, toughness, healing);


            if (isUpgrade)
            {
                Logger.Log("{0} is an Upgrade! Damage={1:0.0}% Toughness={2:0.0}% Healing={3:0.0}%", item.Name, damage * 100, toughness * 100, healing * 100);
            }
            return(isUpgrade);
        }