Exemplo n.º 1
0
        public static CachedACDItem GetTrinityItem(ACDItem item)
        {
            try
            {
                if (!item.IsValid)
                {
                    return(default(CachedACDItem));
                }

                CachedACDItem cItem = new CachedACDItem(item.Stats)
                {
                    AcdItem           = item,
                    InternalName      = item.InternalName,
                    RealName          = item.Name,
                    Level             = item.Level,
                    Quality           = item.GetItemQuality(),
                    GoldAmount        = item.Gold,
                    BalanceId         = item.GameBalanceId,
                    DynamicId         = item.AnnId,
                    ActorSnoId        = item.ActorSnoId,
                    OneHanded         = item.IsOneHand,
                    TwoHanded         = item.IsTwoHand,
                    DyeType           = item.DyeType,
                    ItemType          = item.GetItemType(),
                    BaseType          = item.ItemBaseType,
                    FollowerType      = item.FollowerSpecialType,
                    IsUnidentified    = item.IsUnidentified,
                    ItemStackQuantity = item.ItemStackQuantity,
                    InventoryRow      = item.InventoryRow,
                    InventoryColumn   = item.InventoryColumn,
                    ItemLink          = item.ItemLink,
                    GameBalanceId     = item.GameBalanceId,
                    TrinityItemType   = TypeConversions.DetermineItemType(item.InternalName, item.GetItemType(), item.FollowerSpecialType),
                    IsAncient         = item.GetAttribute <int>(ActorAttributeType.AncientRank) > 0,
                    InventorySlot     = item.InventorySlot,
                };

                TrinityItemBaseType trinityItemBaseType = TypeConversions
                                                          .GetTrinityItemBaseType(
                    TypeConversions.DetermineItemType(
                        item.InternalName,
                        item.GetItemType(),
                        item.FollowerSpecialType));

                cItem.TrinityItemBaseType = trinityItemBaseType;
                cItem.IsEquipment         = GetIsEquipment(trinityItemBaseType);
                cItem.IsSalvageable       = GetIsSalvageable(cItem);
                cItem.IsClassItem         = GetIsClassItem(cItem);
                cItem.IsOffHand           = GetIsOffhand(cItem);
                return(cItem);
            }
            catch (Exception ex)
            {
                Core.Logger.Error("Error getting TrinityItem {0}", ex.Message);
                return(default(CachedACDItem));
            }
        }
Exemplo n.º 2
0
        internal static bool EvaluateProperty(LRule itemRule, ACDItem item, out float newValue)
        {
            var prop    = itemRule.ItemProperty;
            var value   = (float)itemRule.Value;
            var variant = itemRule.Variant;

            var    result          = false;
            string friendlyVariant = string.Empty;
            float  itemValue       = 0;
            float  ruleValue       = 0;
            float  returnValue     = -1;

            switch (prop)
            {
            case ItemProperty.PassivePower:
                itemValue   = ItemDataUtils.GetPassivePowerValue(item);
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Ancient:
                itemValue   = item.Stats.IsAncient ? 1 : 0;
                ruleValue   = value;
                result      = item.Stats.IsAncient && Math.Abs(value - 1) < double.Epsilon;
                returnValue = ruleValue;
                break;

            case ItemProperty.PrimaryStat:
                itemValue   = item.Stats.HighestPrimaryAttribute;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.CriticalHitChance:
                itemValue   = item.Stats.CritPercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.CriticalHitDamage:
                itemValue   = item.Stats.CritDamagePercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.AttackSpeed:
                itemValue = item.Stats.AttackSpeedPercent;
                // TODO: Check if this is required.
                if (Math.Abs(itemValue) < double.Epsilon)
                {
                    itemValue = item.AttacksPerSecondItemPercent;
                }
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ResourceCost:
                itemValue   = item.Stats.ResourceCostReductionPercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Cooldown:
                itemValue   = item.Stats.PowerCooldownReductionPercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ResistAll:
                itemValue   = item.Stats.ResistAll;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Sockets:
                itemValue   = item.Stats.Sockets;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = ruleValue;
                break;

            case ItemProperty.Vitality:
                itemValue   = item.Stats.Vitality;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.AreaDamage:
                itemValue   = item.SplashDamageEffectPercent * 100f;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Thorns:
                itemValue   = item.Stats.Thorns;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.FireSkills:
                itemValue   = item.Stats.FireSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ColdSkills:
                itemValue   = item.Stats.ColdSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LightningSkills:
                itemValue   = item.Stats.LightningSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ArcaneSkills:
                itemValue   = item.Stats.ArcaneSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.HolySkills:
                itemValue   = item.Stats.HolySkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.PoisonSkills:
                itemValue   = item.Stats.PosionSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.PhysicalSkills:
                itemValue   = item.Stats.PhysicalSkillDamagePercentBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.DamageAgainstElites:
                itemValue   = item.Stats.DamagePercentBonusVsElites;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.DamageFromElites:
                itemValue   = item.Stats.DamagePercentReductionFromElites;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.BaseMaxDamage:
                itemValue   = item.Stats.MaxDamage;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.SkillDamage:
                var skillId = variant;
                var skill   = ItemDataUtils.GetSkillsForItemType(item.GetTrinityItemType(), Core.Player.ActorClass).FirstOrDefault(s => s.Id == skillId);
                if (skill != null)
                {
                    friendlyVariant = skill.Name;
                    itemValue       = item.SkillDamagePercent(skill.SNOPower) * 100;
                }
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ElementalDamage:
                var elementId = variant;
                var element   = (Element)elementId;
                if (element != Element.Unknown)
                {
                    var damageType = TypeConversions.GetDamageType(element);
                    friendlyVariant = ((EnumValue <Element>)element).Name;
                    itemValue       = item.GetElementalDamage(damageType);
                }
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.PercentDamage:
                itemValue   = item.Stats.WeaponDamagePercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.CriticalHitsGrantArcane:
                itemValue   = item.Stats.ArcaneOnCrit;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Armor:
                itemValue   = item.Stats.ArmorBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToBlock:
                itemValue   = item.Stats.BlockChanceBonus;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToBlockTotal:
                itemValue   = item.Stats.BlockChance;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.HatredRegen:
                itemValue   = item.Stats.HatredRegen;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LifePercent:
                itemValue   = item.Stats.LifePercent;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LifePerHit:
                itemValue   = item.Stats.LifeOnHit;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.RegenerateLifePerSecond:
                itemValue   = item.Stats.HealthPerSecond;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ManaRegen:
                itemValue   = item.Stats.ManaRegen;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MovementSpeed:
                itemValue   = item.Stats.MovementSpeed;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.SpiritRegen:
                itemValue   = item.Stats.SpiritRegen;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.WrathRegen:
                itemValue   = item.Stats.FaithRegen;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LifePerFury:
                itemValue   = item.Stats.HealPerFury;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LifePerSpirit:
                itemValue   = item.Stats.HealPerSpirit;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.LifePerWrath:
                itemValue   = item.Stats.HealPerFaith;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumArcane:
                itemValue   = item.Stats.MaxArcanum;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumSpirit:
                itemValue   = item.Stats.MaxSpirit;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumDiscipline:
                itemValue   = item.Stats.MaxDiscipline;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumFury:
                itemValue   = item.Stats.MaxFury;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumMana:
                itemValue   = item.Stats.MaxMana;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumWrath:
                itemValue   = item.Stats.MaxFaith;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToBlind:
                itemValue   = item.Stats.WeaponOnHitBlindProcChance;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToFreeze:
                itemValue   = item.Stats.WeaponOnHitFreezeProcChance;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToImmobilize:
                itemValue   = item.Stats.WeaponOnHitImmobilizeProcChance;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.ChanceToStun:
                itemValue   = item.Stats.WeaponOnHitStunProcChance;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.MaximumEssence:
                itemValue   = item.ResourceMaxEssence;
                ruleValue   = value;
                result      = itemValue >= ruleValue;
                returnValue = itemValue;
                break;

            case ItemProperty.Attribute:

                try
                {
                    friendlyVariant = $"{itemRule.AttributeKey} {itemRule.AttributeModifier} {itemRule.AttributeValue}";

                    var error = string.Empty;
                    var key   = itemRule.AttributeKey.Trim();
                    var mod   = itemRule.AttributeModifier.Trim();
                    var val   = itemRule.AttributeValue.Trim();

                    if (!Enum.TryParse(key, true, out ActorAttributeType attribute))
                    {
                        error += $"No ActorAttributeType exists with key '{itemRule.AttributeKey}'. ";
                    }

                    var modifierId = -1;
                    if (!string.IsNullOrEmpty(mod))
                    {
                        if (!int.TryParse(mod, out modifierId))
                        {
                            error += $"Modifier '{itemRule.AttributeModifier}' is not a number. ";
                        }
                    }

                    if (!float.TryParse(val, out value))
                    {
                        error += $"Value '{itemRule.AttributeModifier}' is not a number. ";
                    }

                    if (!string.IsNullOrEmpty(error))
                    {
                        Core.Logger.Warn($"Attribute specified in ItemList is invalid. {friendlyVariant} - {error}");
                        break;
                    }

                    itemValue   = item.GetAttribute <float>(attribute, modifierId);
                    ruleValue   = value;
                    result      = itemValue >= ruleValue;
                    returnValue = itemValue;
                }
                catch (Exception ex)
                {
                    Core.Logger.Error($"Exception evaluating ItemList rule Attribute {ex}");
                }
                break;
            }

            Core.Logger.Verbose($"  >>  Evaluated {item.Name} -- {prop.ToString().AddSpacesToSentence()} {friendlyVariant} (Item: {itemValue} -v- Rule: {ruleValue}) = {result}");
            newValue = returnValue;
            return(result);
        }
Exemplo n.º 3
0
 public static double WeaponBaseMinPhysicalDamage(this ACDItem acdItem)
 {
     return(acdItem.GetAttribute <float>(ActorAttributeType.DamageMaxWeaponBonusPhysical));
 }
Exemplo n.º 4
0
 public static double WeaponDamagePercent(this ACDItem acdItem)
 {
     return(Math.Round(acdItem.GetAttribute <float>(ActorAttributeType.DamageWeaponPercentAll) * 100, MidpointRounding.AwayFromZero));
 }
Exemplo n.º 5
0
 public static double SkillDamagePercent(this ACDItem acdItem, SNOPower power)
 {
     return(Math.Round(acdItem.GetAttribute <float>(((int)power << 12) + ((int)ActorAttributeType.PowerDamagePercentBonus & 0xFFF)) * 100, MidpointRounding.AwayFromZero));
 }
Exemplo n.º 6
0
 public static double SkillDamagePercent(ACDItem acdItem, SNOPower power)
 {
     return Math.Round(acdItem.GetAttribute<float>(((int)power << 12) + ((int)ActorAttributeType.PowerDamagePercentBonus & 0xFFF)) * 100, MidpointRounding.AwayFromZero);
 }
Exemplo n.º 7
0
 /// <summary>
 /// Gets the item stack quantity.
 /// </summary>
 /// <param name="item">The item.</param>
 /// <returns>System.Int32.</returns>
 public static int GetItemStackQuantity(this ACDItem item)
 {
     return((item.GetAttribute <int>(ActorAttributeType.ItemStackQuantityHi) << 32) | item.GetAttribute <int>(ActorAttributeType.ItemStackQuantityLo));
 }
Exemplo n.º 8
0
        public static float SkillDamagePercent(this ACDItem item, SNOPower power)
        {
            var key = new AttributeKey((int)ActorAttributeType.PowerDamagePercentBonus, (int)power);

            return(item.GetAttribute <float>(key.BaseAttribute, key.ModifierId));
        }
Exemplo n.º 9
0
        public static int GetElementalDamage(this ACDItem item, DamageType damageType)
        {
            var key = new AttributeKey((int)ActorAttributeType.DamageDealtPercentBonus, (int)damageType);

            return((int)Math.Round(item.GetAttribute <float>(key.BaseAttribute, key.ModifierId) * 100, MidpointRounding.AwayFromZero));
        }
Exemplo n.º 10
0
        public static CachedACDItem GetCachedItem(ACDItem item)
        {
            try
            {
                if (!item.IsValid)
                    return default(CachedACDItem);

                CachedACDItem cItem = new CachedACDItem(item.Stats)
                {
                    AcdItem = item,
                    InternalName = item.InternalName,
                    RealName = item.Name,
                    Level = item.Level,
                    Quality = item.ItemLinkColorQuality(),
                    GoldAmount = item.Gold,
                    BalanceID = item.GameBalanceId,
                    DynamicID = item.DynamicId,
                    ActorSNO = item.ActorSNO,
                    OneHanded = item.IsOneHand,
                    TwoHanded = item.IsTwoHand,
                    DyeType = item.DyeType,
                    DBItemType = item.ItemType,
                    DBBaseType = item.ItemBaseType,
                    FollowerType = item.FollowerSpecialType,
                    IsUnidentified = item.IsUnidentified,
                    ItemStackQuantity = item.ItemStackQuantity,
                    Row = item.InventoryRow,
                    Column = item.InventoryColumn,
                    ItemLink = item.ItemLink,
                    TrinityItemType = TrinityItemManager.DetermineItemType(item.InternalName, item.ItemType, item.FollowerSpecialType),
                    IsAncient = item.GetAttribute<int>(ActorAttributeType.AncientRank) > 0,

                };
                TrinityItemBaseType trinityItemBaseType = TrinityItemManager.DetermineBaseType(TrinityItemManager.DetermineItemType(item.InternalName, item.ItemType, item.FollowerSpecialType));
                cItem.TrinityItemBaseType = trinityItemBaseType;
                cItem.IsEquipment = GetIsEquipment(trinityItemBaseType);
                cItem.IsSalvageable = GetIsSalvageable(cItem);

                return cItem;
            }
            catch (Exception ex)
            {
                Logger.LogError("Error getting CachedItem {0}", ex.Message);
                return default(CachedACDItem);
            }

        }