internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents)
        {
            var   raidRewardsTypes = new HashSet <int>();
            ulong build            = combatData.GetBuildEvent().Build;

            if (build < 97235)
            {
                raidRewardsTypes = new HashSet <int>
                {
                    // Old types, on each kill
                    55821,
                    60685
                };
            }
            else
            {
                raidRewardsTypes = new HashSet <int>
                {
                    // New types, once per week
                    22797
                };
            }
            IReadOnlyList <RewardEvent> rewards = combatData.GetRewardEvents();
            RewardEvent reward = rewards.FirstOrDefault(x => raidRewardsTypes.Contains(x.RewardType));

            if (reward != null)
            {
                fightData.SetSuccess(true, reward.Time);
            }
            else
            {
                switch (GenericFallBackMethod)
                {
                case FallBackMethod.Death:
                    SetSuccessByDeath(combatData, fightData, playerAgents, true, GetSuccessCheckIds());
                    break;

                case FallBackMethod.CombatExit:
                    SetSuccessByDeath(combatData, fightData, playerAgents, true, GetSuccessCheckIds());
                    if (!fightData.Success)
                    {
                        SetSuccessByCombatExit(new HashSet <int>(GetSuccessCheckIds()), combatData, fightData, playerAgents);
                    }
                    break;

                default:
                    break;
                }
            }
        }
Exemplo n.º 2
0
        internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData)
        {
            NPC target = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Skorvald);

            if (target == null)
            {
                throw new MissingKeyActorsException("Skorvald not found");
            }
            if (combatData.GetBuildEvent().Build >= 106277)
            {
                return(agentData.GetNPCsByID(16725).Any() && agentData.GetNPCsByID(11245).Any() ? FightData.CMStatus.CM : FightData.CMStatus.NoCM);
            }
            else
            {
                return((target.GetHealth(combatData) == 5551340) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM);
            }
        }
Exemplo n.º 3
0
        private static IReadOnlyList <InstantCastEvent> ComputeInstantCastEvents(CombatData combatData, SkillData skillData, AgentData agentData, IReadOnlyList <InstantCastFinder> instantCastFinders)
        {
            var   res   = new List <InstantCastEvent>();
            ulong build = combatData.GetBuildEvent().Build;

            foreach (InstantCastFinder icf in instantCastFinders)
            {
                if (icf.Available(build))
                {
                    if (icf.NotAccurate)
                    {
                        skillData.NotAccurate.Add(icf.SkillID);
                    }
                    res.AddRange(icf.ComputeInstantCast(combatData, skillData, agentData));
                }
            }
            return(res);
        }
        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);
            }
        }