Exemple #1
0
 public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success && _specialSplit > 0)
     {
         NPC target = Targets.Find(x => x.ID == (int)ParseEnum.TargetIDS.Deimos);
         if (target == null)
         {
             throw new InvalidOperationException("Error Encountered: Deimos not found");
         }
         List <AttackTargetEvent> attackTargets = combatData.GetAttackTargetEvents(target.AgentItem);
         if (attackTargets.Count == 0)
         {
             return;
         }
         long      specialSplitTime = _specialSplit;
         AgentItem attackTarget     = attackTargets.Last().AttackTarget;
         // sanity check
         TargetableEvent attackableEvent = combatData.GetTargetableEvents(attackTarget).LastOrDefault(x => x.Targetable && x.Time > specialSplitTime - GeneralHelper.ServerDelayConstant);
         if (attackableEvent == null)
         {
             return;
         }
         TargetableEvent notAttackableEvent = combatData.GetTargetableEvents(attackTarget).LastOrDefault(x => !x.Targetable && x.Time > attackableEvent.Time);
         if (notAttackableEvent == null)
         {
             return;
         }
         var playerExits = new List <ExitCombatEvent>();
         foreach (AgentItem a in playerAgents)
         {
             playerExits.AddRange(combatData.GetExitCombatEvents(a));
         }
         ExitCombatEvent     lastPlayerExit  = playerExits.Count > 0 ? playerExits.MaxBy(x => x.Time) : null;
         AbstractDamageEvent lastDamageTaken = combatData.GetDamageTakenData(target.AgentItem).LastOrDefault(x => (x.Damage > 0) && (playerAgents.Contains(x.From) || playerAgents.Contains(x.From.Master)));
         if (lastDamageTaken != null && lastPlayerExit != null)
         {
             fightData.SetSuccess(lastPlayerExit.Time > notAttackableEvent.Time + 1000, lastDamageTaken.Time);
         }
     }
 }
        protected static void SetSuccessByCombatExit(List <NPC> targets, CombatData combatData, FightData fightData, HashSet <AgentItem> playerAgents)
        {
            if (targets.Count == 0)
            {
                return;
            }
            var targetExits       = new List <ExitCombatEvent>();
            var lastTargetDamages = new List <AbstractHealthDamageEvent>();

            foreach (NPC t in targets)
            {
                EnterCombatEvent enterCombat = combatData.GetEnterCombatEvents(t.AgentItem).LastOrDefault();
                if (enterCombat != null)
                {
                    targetExits.AddRange(combatData.GetExitCombatEvents(t.AgentItem).Where(x => x.Time > enterCombat.Time));
                }
                else
                {
                    targetExits.AddRange(combatData.GetExitCombatEvents(t.AgentItem));
                }
                AbstractHealthDamageEvent lastDamage = combatData.GetDamageTakenData(t.AgentItem).LastOrDefault(x => (x.HealthDamage > 0) && playerAgents.Contains(x.From.GetFinalMaster()));
                if (lastDamage != null)
                {
                    lastTargetDamages.Add(lastDamage);
                }
            }
            ExitCombatEvent           lastTargetExit  = targetExits.Count > 0 ? targetExits.MaxBy(x => x.Time) : null;
            AbstractHealthDamageEvent lastDamageTaken = lastTargetDamages.Count > 0 ? lastTargetDamages.MaxBy(x => x.Time) : null;

            // Make sure the last damage has been done before last combat exit
            if (lastTargetExit != null && lastDamageTaken != null && lastTargetExit.Time + 100 >= lastDamageTaken.Time)
            {
                if (!AtLeastOnePlayerAlive(combatData, fightData, lastTargetExit.Time, playerAgents))
                {
                    return;
                }
                fightData.SetSuccess(true, lastDamageTaken.Time);
            }
        }
Exemple #3
0
        public override void CheckMechanic(ParsedLog log, Dictionary <Mechanic, List <MechanicEvent> > mechanicLogs, Dictionary <ushort, DummyActor> regroupedMobs)
        {
            CombatData combatData          = log.CombatData;
            IEnumerable <AgentItem> agents = log.AgentData.GetAgentsByID((ushort)SkillId);

            foreach (AgentItem a in agents)
            {
                List <AbstractDamageEvent> combatitems = combatData.GetDamageTakenData(a);
                foreach (AbstractDamageEvent c in combatitems)
                {
                    if (c is DirectDamageEvent && c.HasHit && Keep(c, log))
                    {
                        foreach (Player p in log.PlayerList)
                        {
                            if (c.From == p.AgentItem || c.MasterFrom == p.AgentItem)
                            {
                                mechanicLogs[this].Add(new MechanicEvent(c.Time, this, p));
                            }
                        }
                    }
                }
            }
        }
        internal override void CheckMechanic(ParsedEvtcLog log, Dictionary <Mechanic, List <MechanicEvent> > mechanicLogs, Dictionary <int, AbstractSingleActor> regroupedMobs)
        {
            CombatData combatData          = log.CombatData;
            IEnumerable <AgentItem> agents = log.AgentData.GetNPCsByID((int)SkillId);

            foreach (AgentItem a in agents)
            {
                List <AbstractDamageEvent> combatitems = combatData.GetDamageTakenData(a);
                foreach (AbstractDamageEvent c in combatitems)
                {
                    if (c is DirectDamageEvent && c.HasHit && Keep(c, log))
                    {
                        foreach (Player p in log.PlayerList)
                        {
                            if (c.From.GetFinalMaster() == p.AgentItem)
                            {
                                mechanicLogs[this].Add(new MechanicEvent(c.Time, this, p));
                            }
                        }
                    }
                }
            }
        }
Exemple #5
0
 public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success)
     {
         Target target = Targets.Find(x => x.ID == TriggerID);
         if (target == null)
         {
             throw new InvalidOperationException("Target for success by combat exit not found");
         }
         AgentItem zommoros = agentData.GetAgentsByID(21118).LastOrDefault();
         if (zommoros == null)
         {
             return;
         }
         SpawnEvent          npcSpawn        = combatData.GetSpawnEvents(zommoros).LastOrDefault();
         AbstractDamageEvent lastDamageTaken = combatData.GetDamageTakenData(target.AgentItem).LastOrDefault(x => (x.Damage > 0) && (playerAgents.Contains(x.From) || playerAgents.Contains(x.MasterFrom)));
         if (npcSpawn != null && lastDamageTaken != null)
         {
             fightData.SetSuccess(true, fightData.ToLogSpace(lastDamageTaken.Time));
         }
     }
 }
        internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents)
        {
            // check reward
            NPC mainTarget = Targets.FirstOrDefault(x => x.ID == GenericTriggerID);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Main target of the fight not found");
            }
            RewardEvent reward = combatData.GetRewardEvents().LastOrDefault();
            AbstractHealthDamageEvent lastDamageTaken = combatData.GetDamageTakenData(mainTarget.AgentItem).LastOrDefault(x => (x.HealthDamage > 0) && playerAgents.Contains(x.From.GetFinalMaster()));

            if (lastDamageTaken != null)
            {
                if (reward != null && Math.Abs(lastDamageTaken.Time - reward.Time) < 100)
                {
                    fightData.SetSuccess(true, Math.Min(lastDamageTaken.Time, reward.Time));
                }
                else
                {
                    SetSuccessByDeath(combatData, fightData, playerAgents, true, GenericTriggerID);
                }
            }
        }
Exemple #7
0
        internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
        {
            NPC mainTarget = Targets.FirstOrDefault(x => x.ID == GenericTriggerID);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Golem not found");
            }
            AbstractHealthDamageEvent lastDamageTaken = combatData.GetDamageTakenData(mainTarget.AgentItem).LastOrDefault(x => x.HealthDamage > 0);
            long fightEndLogTime = fightData.FightEnd;
            bool success         = false;

            if (lastDamageTaken != null)
            {
                fightEndLogTime = lastDamageTaken.Time;
            }
            IReadOnlyList <HealthUpdateEvent> hpUpdates = combatData.GetHealthUpdateEvents(mainTarget.AgentItem);

            if (hpUpdates.Count > 0)
            {
                success = hpUpdates.Last().HPPercent < 2.00;
            }
            fightData.SetSuccess(success, fightEndLogTime);
        }
Exemple #8
0
        public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
        {
            Target mainTarget = Targets.Find(x => x.ID == TriggerID);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            AbstractDamageEvent lastDamageTaken = combatData.GetDamageTakenData(mainTarget.AgentItem).LastOrDefault(x => x.Damage > 0);
            long fightEndLogTime = fightData.FightEndLogTime;
            bool success         = false;

            if (lastDamageTaken != null)
            {
                fightEndLogTime = fightData.ToLogSpace(lastDamageTaken.Time);
            }
            List <HealthUpdateEvent> hpUpdates = combatData.GetHealthUpdateEvents(mainTarget.AgentItem);

            if (hpUpdates.Count > 0)
            {
                success = hpUpdates.Last().HPPercent < 2.00;
            }
            fightData.SetSuccess(success, fightEndLogTime);
        }
        internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents)
        {
            // no bouny chest detection, the reward is delayed
            AbstractSingleActor soowon = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.TheDragonVoidSooWon);

            if (soowon != null)
            {
                AttackTargetEvent attackTargetEvent = combatData.GetAttackTargetEvents(soowon.AgentItem).FirstOrDefault();
                var targetables = combatData.GetTargetableEvents(attackTargetEvent.AttackTarget).Where(x => x.Time >= soowon.FirstAware).ToList();
                var targetOffs  = targetables.Where(x => !x.Targetable).ToList();
                if (targetOffs.Count == 2)
                {
                    AbstractHealthDamageEvent lastDamageTaken = combatData.GetDamageTakenData(soowon.AgentItem).LastOrDefault(x => (x.HealthDamage > 0) && playerAgents.Contains(x.From.GetFinalMaster()));
                    if (lastDamageTaken != null)
                    {
                        if (!AtLeastOnePlayerAlive(combatData, fightData, Math.Min(targetOffs[1].Time + 100, fightData.FightEnd), playerAgents))
                        {
                            return;
                        }
                        fightData.SetSuccess(true, targetOffs[1].Time);
                    }
                }
            }
        }
 public List <CombatItem> GetDamageTakenData(ushort key, long start, long end)
 {
     return(CombatData.GetDamageTakenData(key, start, end));
 }
Exemple #11
0
 public List <CombatItem> GetDamageTakenData(ushort key)
 {
     return(CombatData.GetDamageTakenData(key));
 }