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