internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor nikare = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Nikare); AbstractSingleActor kenut = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Kenut); if (nikare == null) { throw new MissingKeyActorsException("Nikare not found"); } if (kenut != null) { return(kenut.GetHealth(combatData) > 16e6 || nikare.GetHealth(combatData) > 18e6 ? FightData.CMStatus.CM : FightData.CMStatus.NoCM); // Kenut or nikare hp } return((nikare.GetHealth(combatData) > 18e6) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM); //Health of Nikare }
internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor target = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Samarog); if (target == null) { throw new MissingKeyActorsException("Samarog not found"); } return((target.GetHealth(combatData) > 30e6) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM); }
internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor target = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.PeerlessQadim); if (target == null) { throw new MissingKeyActorsException("Peerless Qadim not found"); } return((target.GetHealth(combatData) > 48e6) ? FightData.EncounterMode.CM : FightData.EncounterMode.Normal); }
internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor mordremoth = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Mordremoth); if (mordremoth == null) { throw new MissingKeyActorsException("Mordremoth not found"); } return((mordremoth.GetHealth(combatData) > 9e6) ? FightData.EncounterMode.CM : FightData.EncounterMode.Story); }
internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor maiTrin = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.MaiTrinStrike); if (maiTrin == null) { throw new MissingKeyActorsException("Mai Trin not found"); } return(maiTrin.GetHealth(combatData) > 8e6 ? FightData.EncounterMode.CM : FightData.EncounterMode.Normal); }
internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor ankka = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Ankka); if (ankka == null) { throw new MissingKeyActorsException("Ankka not found"); } MapIDEvent map = combatData.GetMapIDEvents().FirstOrDefault(); if (map != null && map.MapID == 1434) { return(FightData.EncounterMode.Story); } return(ankka.GetHealth(combatData) > 50e6 ? FightData.EncounterMode.CM : FightData.EncounterMode.Normal); }
protected ActorDto(AbstractSingleActor actor, ParsedEvtcLog log, ActorDetailsDto details) { Health = actor.GetHealth(log.CombatData); Condi = actor.Condition; Conc = actor.Concentration; Heal = actor.Healing; Icon = actor.GetIcon(); Name = actor.Character; Tough = actor.Toughness; Details = details; UniqueID = actor.UniqueID; foreach (KeyValuePair <long, Minions> pair in actor.GetMinions(log)) { Minions.Add(new MinionDto() { Id = pair.Key, Name = pair.Value.Character }); } }
internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { AbstractSingleActor target = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Skorvald); if (target == null) { throw new MissingKeyActorsException("Skorvald not found"); } if (combatData.GetBuildEvent().Build >= 106277) { // Agent check not reliable, produces false positives and regular false negatives /*if (agentData.GetNPCsByID(16725).Any() && agentData.GetNPCsByID(11245).Any()) * { * return FightData.CMStatus.CM; * }*/ // Check some CM skills instead, not perfect but helps, // Solar Bolt is the first thing he tries to cast, that looks very consistent // If the phase 1 is super fast to the point skorvald does not cast anything, supernova should be there // Otherwise we are looking at a super fast phase 1 (< 7 secondes) where the team ggs just before supernova // Joining the encounter mid fight may also yield a false negative but at that point the log is incomplete already var cmSkills = new HashSet <long> { 39313, // CM Solar Bolt 39225, // CM Supernova }; if (combatData.GetSkills().Intersect(cmSkills).Any()) { return(FightData.CMStatus.CM); } return(FightData.CMStatus.NoCM); } else { return((target.GetHealth(combatData) == 5551340) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM); } }
public static void FillJsonActor(JsonActor jsonActor, AbstractSingleActor actor, ParsedEvtcLog log, RawFormatSettings settings, Dictionary <string, JsonLog.SkillDesc> skillDesc, Dictionary <string, JsonLog.BuffDesc> buffDesc) { IReadOnlyList <PhaseData> phases = log.FightData.GetNonDummyPhases(log); // jsonActor.Name = actor.Character; jsonActor.TotalHealth = actor.GetHealth(log.CombatData); jsonActor.Toughness = actor.Toughness; jsonActor.Healing = actor.Healing; jsonActor.Concentration = actor.Concentration; jsonActor.Condition = actor.Condition; jsonActor.HitboxHeight = actor.HitboxHeight; jsonActor.HitboxWidth = actor.HitboxWidth; jsonActor.InstanceID = actor.AgentItem.InstID; jsonActor.IsFake = actor.IsFakeActor; // jsonActor.DpsAll = phases.Select(phase => JsonStatisticsBuilder.BuildJsonDPS(actor.GetDPSStats(log, phase.Start, phase.End))).ToArray(); jsonActor.StatsAll = phases.Select(phase => JsonStatisticsBuilder.BuildJsonGameplayStatsAll(actor.GetGameplayStats(log, phase.Start, phase.End))).ToArray(); jsonActor.Defenses = phases.Select(phase => JsonStatisticsBuilder.BuildJsonDefensesAll(actor.GetDefenseStats(log, phase.Start, phase.End))).ToArray(); // IReadOnlyDictionary <long, Minions> minionsList = actor.GetMinions(log); if (minionsList.Values.Any()) { jsonActor.Minions = minionsList.Values.Select(x => JsonMinionsBuilder.BuildJsonMinions(x, log, skillDesc, buffDesc)).ToList(); } // var skillByID = actor.GetIntersectingCastEvents(log, 0, log.FightData.FightEnd).GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); if (skillByID.Any()) { jsonActor.Rotation = JsonRotationBuilder.BuildJsonRotationList(log, skillByID, skillDesc); } // if (settings.RawFormatTimelineArrays) { var damage1S = new IReadOnlyList <int> [phases.Count]; var powerDamage1S = new IReadOnlyList <int> [phases.Count]; var conditionDamage1S = new IReadOnlyList <int> [phases.Count]; var breakbarDamage1S = new IReadOnlyList <double> [phases.Count]; for (int i = 0; i < phases.Count; i++) { PhaseData phase = phases[i]; damage1S[i] = actor.Get1SDamageList(log, phase.Start, phase.End, null, ParserHelper.DamageType.All); powerDamage1S[i] = actor.Get1SDamageList(log, phase.Start, phase.End, null, ParserHelper.DamageType.Power); conditionDamage1S[i] = actor.Get1SDamageList(log, phase.Start, phase.End, null, ParserHelper.DamageType.Condition); breakbarDamage1S[i] = actor.Get1SBreakbarDamageList(log, phase.Start, phase.End, null); } jsonActor.Damage1S = damage1S; jsonActor.PowerDamage1S = powerDamage1S; jsonActor.ConditionDamage1S = conditionDamage1S; jsonActor.BreakbarDamage1S = breakbarDamage1S; } if (!log.CombatData.HasBreakbarDamageData) { jsonActor.BreakbarDamage1S = null; } // jsonActor.TotalDamageDist = BuildDamageDistData(actor, phases, log, skillDesc, buffDesc); jsonActor.TotalDamageTaken = BuildDamageTakenDistData(actor, phases, log, skillDesc, buffDesc); // if (settings.RawFormatTimelineArrays) { Dictionary <long, BuffsGraphModel> buffGraphs = actor.GetBuffGraphs(log); jsonActor.BoonsStates = JsonBuffsUptimeBuilder.GetBuffStates(buffGraphs[Buff.NumberOfBoonsID]); jsonActor.ConditionsStates = JsonBuffsUptimeBuilder.GetBuffStates(buffGraphs[Buff.NumberOfConditionsID]); if (buffGraphs.TryGetValue(Buff.NumberOfActiveCombatMinionsID, out BuffsGraphModel states)) { jsonActor.ActiveCombatMinions = JsonBuffsUptimeBuilder.GetBuffStates(states); } // Health jsonActor.HealthPercents = actor.GetHealthUpdates(log).Select(x => new double[2] { x.Start, x.Value }).ToList(); jsonActor.BarrierPercents = actor.GetBarrierUpdates(log).Select(x => new double[2] { x.Start, x.Value }).ToList(); } if (log.CanCombatReplay) { jsonActor.CombatReplayData = JsonActorCombatReplayDataBuilder.BuildJsonActorCombatReplayDataBuilder(actor, log, settings); } }