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);
        }
Beispiel #2
0
        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);
                }
            }
        }
Beispiel #3
0
        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));
                }
            }
        }
Beispiel #4
0
        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);
        }