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 && _specialSplitLogTime > 0)
     {
         Target target = Targets.Find(x => x.ID == TriggerID);
         if (target == null)
         {
             throw new InvalidOperationException("Target for success by combat exit not found");
         }
         List <AttackTargetEvent> attackTargets = combatData.GetAttackTargetEvents(target.AgentItem);
         if (attackTargets.Count == 0)
         {
             return;
         }
         long      specialSplitTime         = fightData.ToFightSpace(_specialSplitLogTime);
         AgentItem attackTarget             = attackTargets.Last().AttackTarget;
         List <ExitCombatEvent> 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;
         TargetableEvent     notAttackableEvent = combatData.GetTargetableEvents(attackTarget).LastOrDefault(x => !x.Targetable && x.Time > specialSplitTime);
         AbstractDamageEvent lastDamageTaken    = combatData.GetDamageTakenData(target.AgentItem).LastOrDefault(x => (x.Damage > 0) && (playerAgents.Contains(x.From) || playerAgents.Contains(x.MasterFrom)));
         if (notAttackableEvent != null && lastDamageTaken != null && lastPlayerExit != null)
         {
             fightData.SetSuccess(lastPlayerExit.Time > notAttackableEvent.Time + 1000, fightData.ToLogSpace(lastDamageTaken.Time));
         }
     }
 }
Exemple #2
0
        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)
                {
                    fightData.SetSuccess(true, targetOffs[1].Time);
                }
            }
        }
 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("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.GetFinalMaster()));
         if (lastDamageTaken != null && lastPlayerExit != null)
         {
             fightData.SetSuccess(lastPlayerExit.Time > notAttackableEvent.Time + 1000, lastDamageTaken.Time);
         }
     }
 }
        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);
                    }
                }
            }
        }