internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases) { List <PhaseData> phases = GetInitialPhase(log); AbstractSingleActor ankka = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Ankka); if (ankka == null) { throw new MissingKeyActorsException("Ankka not found"); } phases[0].AddTarget(ankka); if (!requirePhases) { return(phases); } List <PhaseData> subPhases = GetPhasesByInvul(log, AnkkaPlateformChanging, ankka, false, true); for (int i = 0; i < subPhases.Count; i++) { subPhases[i].Name = "Location " + (i + 1); subPhases[i].AddTarget(ankka); } phases.AddRange(subPhases); List <PhaseData> subSubPhases = GetPhasesByInvul(log, Determined895, ankka, false, false); subSubPhases.RemoveAll(x => subPhases.Any(y => Math.Abs(y.Start - x.Start) < ParserHelper.ServerDelayConstant && Math.Abs(y.End - x.End) < ParserHelper.ServerDelayConstant)); int curSubSubPhaseID = 0; PhaseData previousSubPhase = null; for (int i = 0; i < subSubPhases.Count; i++) { PhaseData subsubPhase = subSubPhases[i]; PhaseData subPhase = subPhases.FirstOrDefault(x => x.Start - ParserHelper.ServerDelayConstant <= subsubPhase.Start && x.End + ParserHelper.ServerDelayConstant >= subsubPhase.End); if (previousSubPhase != subPhase) { previousSubPhase = subPhase; curSubSubPhaseID = 0; } if (subPhase != null) { int index = subPhases.IndexOf(subPhase); subsubPhase.OverrideStart(Math.Max(subsubPhase.Start, subPhase.Start)); subsubPhase.OverrideEnd(Math.Min(subsubPhase.End, subPhase.End)); subsubPhase.Name = "Location " + (index + 1) + " - " + (++curSubSubPhaseID); subsubPhase.AddTarget(ankka); } } phases.AddRange(subSubPhases); // return(phases); }
private static void FallBackPhases(AbstractSingleActor target, List <PhaseData> phases, ParsedEvtcLog log, bool firstPhaseAt0) { IReadOnlyCollection <AgentItem> pAgents = log.PlayerAgents; // clean Nikare related bugs switch (phases.Count) { case 2: { PhaseData p1 = phases[0]; PhaseData p2 = phases[1]; // P1 and P2 merged if (p1.Start == p2.Start) { AbstractHealthDamageEvent hit = log.CombatData.GetDamageTakenData(target.AgentItem).FirstOrDefault(x => x.Time >= p1.End + 5000 && pAgents.Contains(x.From.GetFinalMaster()) && x.HealthDamage > 0 && x is DirectHealthDamageEvent); if (hit != null) { p2.OverrideStart(hit.Time); } else { p2.OverrideStart(p1.End); } } } break; case 3: { PhaseData p1 = phases[0]; PhaseData p2 = phases[1]; PhaseData p3 = phases[2]; // P1 and P2 merged if (p1.Start == p2.Start) { AbstractHealthDamageEvent hit = log.CombatData.GetDamageTakenData(target.AgentItem).FirstOrDefault(x => x.Time >= p1.End + 5000 && pAgents.Contains(x.From.GetFinalMaster()) && x.HealthDamage > 0 && x is DirectHealthDamageEvent); if (hit != null) { p2.OverrideStart(hit.Time); } else { p2.OverrideStart(p1.End); } } // P1/P2 and P3 are merged if (p1.Start == p3.Start || p2.Start == p3.Start) { AbstractHealthDamageEvent hit = log.CombatData.GetDamageTakenData(target.AgentItem).FirstOrDefault(x => x.Time >= p2.End + 5000 && pAgents.Contains(x.From.GetFinalMaster()) && x.HealthDamage > 0 && x is DirectHealthDamageEvent); if (hit != null) { p3.OverrideStart(hit.Time); } else { p3.OverrideStart(p2.End); } } } break; default: break; } if (!firstPhaseAt0 && phases.Count > 0 && phases.First().Start == 0) { PhaseData p1 = phases[0]; AbstractHealthDamageEvent hit = log.CombatData.GetDamageTakenData(target.AgentItem).FirstOrDefault(x => x.Time >= 0 && pAgents.Contains(x.From.GetFinalMaster()) && x.HealthDamage > 0 && x is DirectHealthDamageEvent); if (hit != null) { p1.OverrideStart(hit.Time); } } }
private void FallBackPhases(Target target, List <PhaseData> phases, ParsedLog log, bool firstPhaseAt0) { HashSet <ushort> pIds = new HashSet <ushort>(log.PlayerList.Select(x => x.InstID)); // clean Nikare related bugs switch (phases.Count) { case 2: { PhaseData p1 = phases[0]; PhaseData p2 = phases[1]; // P1 and P2 merged if (p1.Start == p2.Start) { CombatItem hit = log.CombatData.GetDamageTakenData(target.InstID, log.FightData.ToLogSpace(p1.End) + 2000, target.LastAware).FirstOrDefault(x => (pIds.Contains(x.SrcInstid) || pIds.Contains(x.SrcMasterInstid)) && (x.Value > 0 || x.BuffDmg > 0)); if (hit != null) { p2.OverrideStart(log.FightData.ToFightSpace(hit.Time)); } else { p2.OverrideStart(p1.End); } } } break; case 3: { PhaseData p1 = phases[0]; PhaseData p2 = phases[1]; PhaseData p3 = phases[2]; // P1 and P2 merged if (p1.Start == p2.Start) { CombatItem hit = log.CombatData.GetDamageTakenData(target.InstID, log.FightData.ToLogSpace(p1.End) + 2000, target.LastAware).FirstOrDefault(x => (pIds.Contains(x.SrcInstid) || pIds.Contains(x.SrcMasterInstid)) && (x.Value > 0 || x.BuffDmg > 0)); if (hit != null) { p2.OverrideStart(log.FightData.ToFightSpace(hit.Time)); } else { p2.OverrideStart(p1.End); } } // P1/P2 and P3 are merged if (p1.Start == p3.Start || p2.Start == p3.Start) { CombatItem hit = log.CombatData.GetDamageTakenData(target.InstID, log.FightData.ToLogSpace(p2.End) + 2000, target.LastAware).FirstOrDefault(x => (pIds.Contains(x.SrcInstid) || pIds.Contains(x.SrcMasterInstid)) && (x.Value > 0 || x.BuffDmg > 0)); if (hit != null) { p3.OverrideStart(log.FightData.ToFightSpace(hit.Time)); } else { p3.OverrideStart(p2.End); } } } break; default: break; } if (!firstPhaseAt0 && phases.Count > 0 && phases.First().Start == 0) { PhaseData p1 = phases[0]; CombatItem hit = log.CombatData.GetDamageTakenData(target.InstID, log.FightData.ToLogSpace(0), target.LastAware).FirstOrDefault(x => (pIds.Contains(x.SrcInstid) || pIds.Contains(x.SrcMasterInstid)) && (x.Value > 0 || x.BuffDmg > 0)); if (hit != null) { p1.OverrideStart(log.FightData.ToFightSpace(hit.Time)); } } }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { List <PhaseData> phases = GetInitialPhase(log); Boss nikare = Targets.Find(x => x.ID == (ushort)ParseEnum.BossIDS.Nikare); if (nikare == null) { throw new InvalidOperationException("Nikare not found"); } phases[0].Targets.Add(nikare); Boss kenut = Targets.Find(x => x.ID == (ushort)ParseEnum.BossIDS.Kenut); if (kenut != null) { phases[0].Targets.Add(kenut); } if (!requirePhases) { return(phases); } List <PhaseData> nikPhases = GetTargetPhases(log, nikare, new string[] { "Nikare P1", "Nikare P2", "Nikare P3" }); if (kenut != null) { phases.AddRange(GetTargetPhases(log, kenut, new string[] { "Kenut P1", "Kenut P2", "Kenut P3" })); // clean Nikare related bugs switch (nikPhases.Count) { case 2: { PhaseData p1 = nikPhases[0]; PhaseData p2 = nikPhases[1]; // P1 and P2 merged if (p1.Start == p2.Start) { CombatItem combatItem = log.CombatData.GetStatesData(ParseEnum.StateChange.ExitCombat).Where(x => x.SrcInstid == kenut.InstID).FirstOrDefault(); if (combatItem != null) { p2.OverrideStart(combatItem.Time - log.FightData.FightStart); } else { nikPhases.Remove(p2); } } } break; case 3: { PhaseData p1 = nikPhases[0]; PhaseData p2 = nikPhases[1]; PhaseData p3 = nikPhases[2]; // P1 and P2 merged if (p1.Start == p2.Start) { CombatItem combatItem = log.CombatData.GetStatesData(ParseEnum.StateChange.ExitCombat).Where(x => x.SrcInstid == kenut.InstID).FirstOrDefault(); if (combatItem != null) { p2.OverrideStart(combatItem.Time - log.FightData.FightStart); } // P1 and P3 are merged if (p1.Start == p3.Start) { p3.OverrideStart(p2.End); } } // p2 and p3 are merged else if (p2.Start == p3.Start) { p3.OverrideStart(p2.End); } } break; default: break; } } phases.AddRange(nikPhases); phases.Sort((x, y) => x.Start < y.Start ? -1 : 1); return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; List <PhaseData> phases = GetInitialPhase(log); Boss qadim = Targets.Find(x => x.ID == (ushort)ParseEnum.BossIDS.Qadim); if (qadim == null) { throw new InvalidOperationException("Qadim not found"); } phases[0].Targets.Add(qadim); if (!requirePhases) { return(phases); } List <long> moltenArmor = GetFilteredList(log, 52329, qadim).Select(x => x.Time - log.FightData.FightStart).Distinct().ToList(); for (int i = 1; i < moltenArmor.Count; i++) { if (i % 2 == 0) { end = Math.Min(moltenArmor[i], log.FightData.FightDuration); phases.Add(new PhaseData(start, end)); if (i == moltenArmor.Count - 1) { phases.Add(new PhaseData(end, log.FightData.FightDuration)); } } else { start = Math.Min(moltenArmor[i], log.FightData.FightDuration); phases.Add(new PhaseData(end, start)); if (i == moltenArmor.Count - 1) { phases.Add(new PhaseData(start, log.FightData.FightDuration)); } } } string[] names = { "Hydra", "Qadim P1", "Apocalypse", "Qadim P2", "Wyvern", "Qadim P3" }; for (int i = 1; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = names[i - 1]; switch (i) { case 2: case 4: case 6: List <long> pyresFirstAware = log.AgentData.GetAgentsByID((ushort)PyreGuardian).Where(x => phase.InInterval(x.FirstAware - log.FightData.FightStart)).Select(x => x.FirstAware - log.FightData.FightStart).ToList(); if (pyresFirstAware.Count > 0 && pyresFirstAware.Max() > phase.Start) { phase.OverrideStart(pyresFirstAware.Max()); } phase.Targets.Add(qadim); break; default: List <ushort> ids = new List <ushort> { (ushort)WyvernMatriarch, (ushort)WyvernPatriarch, (ushort)AncientInvokedHydra, (ushort)ApocalypseBringer }; AddTargetsToPhase(phase, ids, log); phase.DrawArea = true; phase.DrawEnd = true; phase.DrawStart = true; break; } } phases.RemoveAll(x => x.Start >= x.End); return(phases); }