Esempio n. 1
0
        internal BuffDto(Buff buff, ParsedEvtcLog log)
        {
            Id            = buff.ID;
            Name          = buff.Name;
            Icon          = buff.Link;
            Stacking      = (buff.Type == Buff.BuffType.Intensity);
            Consumable    = (buff.Nature == Buff.BuffNature.Consumable);
            FightSpecific = (buff.Source == ParserHelper.Source.FightSpecific || buff.Source == ParserHelper.Source.FractalInstability);
            BuffInfoEvent buffInfoEvent = log.CombatData.GetBuffInfoEvent(buff.ID);

            if (buffInfoEvent != null)
            {
                var descriptions = new List <string>()
                {
                    "Max Stack(s) " + buff.Capacity
                };
                foreach (BuffFormula formula in buffInfoEvent.Formulas)
                {
                    if (formula.TraitSelf > 0 || formula.TraitSrc > 0)
                    {
                        continue;
                    }
                    var desc = formula.GetDescription(false, log.Buffs.BuffsByIds);
                    if (desc.Length > 0)
                    {
                        descriptions.Add(desc);
                    }
                }
                Description = "";
                foreach (string desc in descriptions)
                {
                    Description += desc + "<br>";
                }
            }
        }
Esempio n. 2
0
            public BuffDesc(Buff item, ParsedLog log)
            {
                Name     = item.Name;
                Icon     = item.Link;
                Stacking = item.Type == Buff.BuffType.Intensity;
                BuffInfoEvent buffInfoEvent = item.BuffInfo;

                if (buffInfoEvent != null)
                {
                    Descriptions = new List <string>()
                    {
                        "Max Stack(s) " + item.Capacity
                    };
                    foreach (BuffFormula formula in buffInfoEvent.Formulas)
                    {
                        if (formula.TraitSelf > 0 || formula.TraitSrc > 0)
                        {
                            continue;
                        }
                        var desc = formula.GetDescription(false, log.Buffs.BuffsByIds);
                        if (desc.Length > 0)
                        {
                            Descriptions.Add(desc);
                        }
                    }
                }
            }
        internal static BuffDesc BuildBuffDesc(Buff item, ParsedEvtcLog log)
        {
            var buffDesc = new BuffDesc();

            buffDesc.Name     = item.Name;
            buffDesc.Icon     = item.Link;
            buffDesc.Stacking = item.Type == Buff.BuffType.Intensity;
            BuffInfoEvent buffInfoEvent = log.CombatData.GetBuffInfoEvent(item.ID);

            if (buffInfoEvent != null)
            {
                var descriptions = new List <string>()
                {
                    "Max Stack(s) " + item.Capacity
                };
                if (item.DurationCap > 0)
                {
                    descriptions.Add("Duration Cap: " + item.DurationCap + " seconds");
                }
                foreach (BuffFormula formula in buffInfoEvent.Formulas)
                {
                    if (formula.IsConditional)
                    {
                        continue;
                    }
                    string desc = formula.GetDescription(false, log.Buffs.BuffsByIds);
                    if (desc.Length > 0)
                    {
                        descriptions.Add(desc);
                    }
                }
                buffDesc.Descriptions = descriptions;
            }
            return(buffDesc);
        }
        public static void AdjustBuffs(CombatData combatData, Dictionary <long, Buff> buffsByID, ParserController operation)
        {
            var solved = new Dictionary <byte, ArcDPSEnums.BuffAttribute>();

            foreach (KeyValuePair <BuffFormulaDescriptor, long> pair in _recognizer)
            {
                if (buffsByID.TryGetValue(pair.Value, out Buff buff))
                {
                    BuffInfoEvent buffInfoEvent = combatData.GetBuffInfoEvent(buff.ID);
                    if (buffInfoEvent != null)
                    {
                        foreach (BuffFormula formula in buffInfoEvent.Formulas)
                        {
                            pair.Key.Match(formula, solved);
                        }
                    }
                }
            }
            if (solved.Values.Distinct().Count() != solved.Values.Count)
            {
                operation.UpdateProgressWithCancellationCheck("Incoherent Data in Buff Info Solver, no formula attribute adjustement will be done");
                solved.Clear();
            }
            foreach (KeyValuePair <long, Buff> pair in buffsByID)
            {
                BuffInfoEvent buffInfoEvent = combatData.GetBuffInfoEvent(pair.Key);
                if (buffInfoEvent != null)
                {
                    pair.Value.VerifyBuffInfoEvent(buffInfoEvent, operation);
                    buffInfoEvent.AdjustBuffInfo(solved);
                }
            }
        }
Esempio n. 5
0
 public void AttachBuffInfoEvent(BuffInfoEvent buffInfoEvent, OperationController operation)
 {
     if (buffInfoEvent.BuffID != ID)
     {
         return;
     }
     BuffInfo = buffInfoEvent;
     if (Capacity != buffInfoEvent.MaxStacks)
     {
         operation.UpdateProgressWithCancellationCheck("Adjusted capacity for " + Name + " from " + Capacity + " to " + buffInfoEvent.MaxStacks);
         if (buffInfoEvent.StackingType != _stackType)
         {
             //_stackType = buffInfoEvent.StackingType; // might be unreliable due to its absence on some logs
             operation.UpdateProgressWithCancellationCheck("Incoherent stack type for " + Name + ": is " + _stackType + " but expected " + buffInfoEvent.StackingType);
         }
         Capacity = buffInfoEvent.MaxStacks;
     }
 }
        protected override HashSet <long> GetIDs(ParsedEvtcLog log, long buffID, long extension)
        {
            BuffInfoEvent buffDescription = log.CombatData.GetBuffInfoEvent(buffID);

            if (buffDescription != null && buffDescription.DurationCap == 0)
            {
                return(base.GetIDs(log, buffID, extension));
            }
            var res = new HashSet <long>();

            foreach (KeyValuePair <long, HashSet <long> > pair in DurationToIDs)
            {
                if (pair.Key >= extension)
                {
                    res.UnionWith(pair.Value);
                }
            }
            return(res);
        }
        // Spec specific checks
        protected override int CouldBeEssenceOfSpeed(AgentItem dst, long extension, long buffID, ParsedEvtcLog log)
        {
            BuffInfoEvent buffDescription = log.CombatData.GetBuffInfoEvent(buffID);

            if (buffDescription != null && buffDescription.DurationCap == 0)
            {
                return(base.CouldBeEssenceOfSpeed(dst, extension, buffID, log));
            }
            if (extension <= EssenceOfSpeed && dst.Spec == ParserHelper.Spec.Soulbeast)
            {
                if (log.FriendliesListBySpec.ContainsKey(ParserHelper.Spec.Herald) ||
                    log.FriendliesListBySpec.ContainsKey(ParserHelper.Spec.Tempest) ||
                    log.FriendliesListBySpec.ContainsKey(ParserHelper.Spec.Chronomancer) ||
                    log.FriendliesListBySpec.ContainsKey(ParserHelper.Spec.Vindicator))
                {
                    // uncertain, needs to check more
                    return(0);
                }
                return(1);
            }
            return(-1);
        }
        internal static BuffDesc BuildBuffDesc(Buff item, ParsedEvtcLog log)
        {
            var buffDesc = new BuffDesc
            {
                Name     = item.Name,
                Icon     = item.Link,
                Stacking = item.Type == Buff.BuffType.Intensity,
                ConversionBasedHealing = log.CombatData.HasEXTHealing ? log.CombatData.EXTHealingCombatData.GetHealingType(item, log) == GW2EIEvtcParser.Extensions.HealingStatsExtensionHandler.EXTHealingType.ConversionBased : false,
                HybridHealing          = log.CombatData.HasEXTHealing ? log.CombatData.EXTHealingCombatData.GetHealingType(item, log) == GW2EIEvtcParser.Extensions.HealingStatsExtensionHandler.EXTHealingType.Hybrid : false
            };
            BuffInfoEvent buffInfoEvent = log.CombatData.GetBuffInfoEvent(item.ID);

            if (buffInfoEvent != null)
            {
                var descriptions = new List <string>()
                {
                    "Max Stack(s) " + buffInfoEvent.MaxStacks
                };
                if (buffInfoEvent.DurationCap > 0)
                {
                    descriptions.Add("Duration Cap: " + Math.Round(buffInfoEvent.DurationCap / 1000.0, 3) + " seconds");
                }
                foreach (BuffFormula formula in buffInfoEvent.Formulas)
                {
                    if (formula.IsConditional)
                    {
                        continue;
                    }
                    string desc = formula.GetDescription(false, log.Buffs.BuffsByIds);
                    if (desc.Length > 0)
                    {
                        descriptions.Add(desc);
                    }
                }
                buffDesc.Descriptions = descriptions;
            }
            return(buffDesc);
        }
Esempio n. 9
0
        public BuffDto(Buff buff, ParsedEvtcLog log) : base(buff, log)
        {
            Stacking      = (buff.Type == Buff.BuffType.Intensity);
            Consumable    = (buff.Nature == Buff.BuffNature.Consumable);
            FightSpecific = (buff.Source == ParserHelper.Source.FightSpecific || buff.Source == ParserHelper.Source.FractalInstability);
            BuffInfoEvent buffInfoEvent = log.CombatData.GetBuffInfoEvent(buff.ID);

            if (buffInfoEvent != null)
            {
                var descriptions = new List <string>()
                {
                    "Max Stack(s) " + buffInfoEvent.MaxStacks
                };
                if (buffInfoEvent.DurationCap > 0)
                {
                    descriptions.Add("Duration Cap: " + Math.Round(buffInfoEvent.DurationCap / 1000.0, 3) + " seconds");
                }
                foreach (BuffFormula formula in buffInfoEvent.Formulas)
                {
                    if (formula.IsConditional)
                    {
                        continue;
                    }
                    string desc = formula.GetDescription(false, log.Buffs.BuffsByIds);
                    if (desc.Length > 0)
                    {
                        descriptions.Add(desc);
                    }
                }
                Description = "";
                foreach (string desc in descriptions)
                {
                    Description += desc + "<br>";
                }
            }
        }
        internal BuffsContainer(ulong build, CombatData combatData, ParserController operation)
        {
            var AllBuffs = new List <List <Buff> >()
            {
                Boons,
                Conditions,
                Commons,
                Gear,
                NormalFoods,
                AscendedFood,
                FoodProcs,
                Utilities,
                Potions,
                Writs,
                FightSpecific,
                FractalInstabilities,
                //
                RevenantHelper.Buffs,
                HeraldHelper.Buffs,
                RenegadeHelper.Buffs,
                VindicatorHelper.Buffs,
                //
                WarriorHelper.Buffs,
                BerserkerHelper.Buffs,
                SpellbreakerHelper.Buffs,
                BladeswornHelper.Buffs,
                //
                GuardianHelper.Buffs,
                DragonhunterHelper.Buffs,
                FirebrandHelper.Buffs,
                WillbenderHelper.Buffs,
                //
                RangerHelper.Buffs,
                DruidHelper.Buffs,
                SoulbeastHelper.Buffs,
                UntamedHelper.Buffs,
                //
                ThiefHelper.Buffs,
                DaredevilHelper.Buffs,
                DeadeyeHelper.Buffs,
                SpecterHelper.Buffs,
                //
                EngineerHelper.Buffs,
                ScrapperHelper.Buffs,
                HolosmithHelper.Buffs,
                MechanistHelper.Buffs,
                //
                MesmerHelper.Buffs,
                ChronomancerHelper.Buffs,
                MirageHelper.Buffs,
                VirtuosoHelper.Buffs,
                //
                NecromancerHelper.Buffs,
                ReaperHelper.Buffs,
                ScourgeHelper.Buffs,
                HarbingerHelper.Buffs,
                //
                ElementalistHelper.Buffs,
                TempestHelper.Buffs,
                WeaverHelper.Buffs,
                CatalystHelper.Buffs,
            };
            var currentBuffs = new List <Buff>();

            foreach (List <Buff> buffs in AllBuffs)
            {
                currentBuffs.AddRange(buffs.Where(x => x.Available(build)));
            }
            _buffsByName = currentBuffs.GroupBy(x => x.Name).ToDictionary(x => x.Key, x =>
            {
                var list = x.ToList();
                if (list.Count > 1)
                {
                    throw new InvalidDataException("Same name present multiple times in buffs - " + x.First().Name);
                }
                return(x.First());
            });
            // Unknown consumables
            var buffIDs        = new HashSet <long>(currentBuffs.Select(x => x.ID));
            var foodAndUtility = new List <BuffInfoEvent>(combatData.GetBuffInfoEvent(BuffCategory.Enhancement));

            foodAndUtility.AddRange(combatData.GetBuffInfoEvent(BuffCategory.Food));
            foreach (BuffInfoEvent buffInfoEvent in foodAndUtility)
            {
                if (!buffIDs.Contains(buffInfoEvent.BuffID))
                {
                    string name = buffInfoEvent.Category == BuffCategory.Enhancement ? "Utility" : "Food";
                    string link = buffInfoEvent.Category == BuffCategory.Enhancement ? "https://wiki.guildwars2.com/images/2/23/Nourishment_utility.png" : "https://wiki.guildwars2.com/images/c/ca/Nourishment_food.png";
                    operation.UpdateProgressWithCancellationCheck("Creating consumable " + name + " " + buffInfoEvent.BuffID);
                    currentBuffs.Add(CreateCustomConsumable(name, buffInfoEvent.BuffID, link, buffInfoEvent.MaxStacks));
                }
            }
            //
            BuffsByIds = currentBuffs.GroupBy(x => x.ID).ToDictionary(x => x.Key, x =>
            {
                var list = x.ToList();
                if (list.Count > 1 && x.Key != Buff.NoBuff && x.Key != Buff.Unknown)
                {
                    throw new InvalidDataException("Same id present multiple times in buffs - " + x.First().ID);
                }
                return(x.First());
            });
            operation.UpdateProgressWithCancellationCheck("Adjusting Buffs");
            BuffInfoSolver.AdjustBuffs(combatData, BuffsByIds, operation, build);
            foreach (Buff buff in currentBuffs)
            {
                BuffInfoEvent buffInfoEvt = combatData.GetBuffInfoEvent(buff.ID);
                if (buffInfoEvt != null)
                {
                    foreach (BuffFormula formula in buffInfoEvt.Formulas)
                    {
                        if (formula.Attr1 == BuffAttribute.Unknown)
                        {
                            operation.UpdateProgressWithCancellationCheck("Unknown Formula for " + buff.Name + ": " + formula.GetDescription(true, BuffsByIds));
                        }
                    }
                }
            }
            BuffsByClassification = currentBuffs.GroupBy(x => x.Classification).ToDictionary(x => x.Key, x => (IReadOnlyList <Buff>)x.ToList());
            BuffsBySource         = currentBuffs.GroupBy(x => x.Source).ToDictionary(x => x.Key, x => (IReadOnlyList <Buff>)x.ToList());
            //
            _buffSourceFinder = GetBuffSourceFinder(build, new HashSet <long>(BuffsByClassification[BuffClassification.Boon].Select(x => x.ID)));
        }