/// <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 }
/// <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); }