Пример #1
0
 public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success)
     {
         NPC desmina = Targets.Find(x => x.ID == (int)ParseEnum.TargetIDS.Desmina);
         if (desmina == null)
         {
             throw new InvalidOperationException("Error Encountered: Desmina not found");
         }
         ExitCombatEvent ooc = combatData.GetExitCombatEvents(desmina.AgentItem).LastOrDefault();
         if (ooc != null)
         {
             long time = 0;
             foreach (NPC mob in TrashMobs.Where(x => x.ID == (int)SpiritHorde3))
             {
                 DespawnEvent dspwnHorde = combatData.GetDespawnEvents(mob.AgentItem).LastOrDefault();
                 if (dspwnHorde != null)
                 {
                     time = Math.Max(dspwnHorde.Time, time);
                 }
             }
             DespawnEvent dspwn = combatData.GetDespawnEvents(desmina.AgentItem).LastOrDefault();
             if (time != 0 && dspwn == null && time <= desmina.LastAware)
             {
                 fightData.SetSuccess(true, time);
             }
         }
     }
 }
Пример #2
0
 protected override bool InitCombatReplay(ParsedEvtcLog log)
 {
     if (base.InitCombatReplay(log))
     {
         // Trim
         DespawnEvent despawnCheck = log.CombatData.GetDespawnEvents(AgentItem).LastOrDefault();
         SpawnEvent   spawnCheck   = log.CombatData.GetSpawnEvents(AgentItem).LastOrDefault();
         DeadEvent    deathCheck   = log.CombatData.GetDeadEvents(AgentItem).LastOrDefault();
         AliveEvent   aliveCheck   = log.CombatData.GetAliveEvents(AgentItem).LastOrDefault();
         if (AgentItem.Type != AgentItem.AgentType.EnemyPlayer && deathCheck != null && (aliveCheck == null || aliveCheck.Time < deathCheck.Time))
         {
             CombatReplay.Trim(AgentItem.FirstAware, deathCheck.Time);
         }
         else if (despawnCheck != null && (spawnCheck == null || spawnCheck.Time < despawnCheck.Time))
         {
             CombatReplay.Trim(AgentItem.FirstAware, despawnCheck.Time);
         }
         else
         {
             CombatReplay.Trim(AgentItem.FirstAware, AgentItem.LastAware);
         }
         return(true);
     }
     return(false);
 }
Пример #3
0
        internal IReadOnlyList <IReadOnlyList <Segment> > GetLifeSpanSegments(ParsedEvtcLog log)
        {
            var  minionsSegments = new List <List <Segment> >();
            long fightDur        = log.FightData.FightEnd;

            foreach (NPC minion in _minionList)
            {
                var  minionSegments = new List <Segment>();
                long start          = Math.Max(minion.FirstAware, 0);
                // Find end
                long      end  = minion.LastAware;
                DeadEvent dead = log.CombatData.GetDeadEvents(minion.AgentItem).LastOrDefault();
                if (dead != null)
                {
                    end = Math.Min(dead.Time, end);
                }
                DespawnEvent despawn = log.CombatData.GetDespawnEvents(minion.AgentItem).LastOrDefault();
                if (despawn != null)
                {
                    end = Math.Min(despawn.Time, end);
                }
                //
                end = Math.Min(end, fightDur);
                minionSegments.Add(new Segment(0, start, 0));
                minionSegments.Add(new Segment(start, end, 1));
                minionSegments.Add(new Segment(end, fightDur, 0));
                minionsSegments.Add(minionSegments);
            }
            return(minionsSegments);
        }
Пример #4
0
    /// <summary>
    /// Despawns a object.
    /// </summary>
    /// <param name="pObject">The object to despawn.</param>
    /// <param name="destroyObject">Should the despawned object also get destroyed?</param>
    /// <param name="nullcheck">Should the list get interated to removed null values?</param>
    /// <returns>True if the object was removed correctly.</returns>
    private bool DespawnInternal(GameObject pObject, bool destroyObject, bool nullcheck)
    {
        if (nullcheck)
        {
            ActiveObject.RemoveAll(g => g == null);
        }
        if (ActiveObject.Remove(pObject))
        {
            if (OnObjectDeSpawn != null)
            {
                OnObjectDeSpawn.Invoke(pObject, this);
            }
            if (destroyObject)
            {
                if (pObject.GetComponent <IDespawnEvent>() != null)
                {
                    OnObjectDeSpawn -= new DespawnEvent(pObject.GetComponent <IDespawnEvent>().OnDespawned);
                }
                Destroy(pObject);
            }
            else
            {
                pObject.SetActive(false);
                DespawnedElements.Enqueue(pObject);
            }

            return(true);
        }
        return(false);
    }
 internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success)
     {
         AgentItem desmina = agentData.GetNPCsByID((int)ArcDPSEnums.TargetID.Desmina).FirstOrDefault();
         if (desmina == null)
         {
             throw new MissingKeyActorsException("Desmina not found");
         }
         ExitCombatEvent ooc = combatData.GetExitCombatEvents(desmina).LastOrDefault();
         if (ooc != null)
         {
             long time = 0;
             foreach (NPC mob in TrashMobs)
             {
                 time = Math.Max(mob.LastAware, time);
             }
             DespawnEvent dspwn = combatData.GetDespawnEvents(desmina).LastOrDefault();
             if (time != 0 && dspwn == null && time + 500 <= desmina.LastAware)
             {
                 if (!AtLeastOnePlayerAlive(combatData, fightData, time, playerAgents))
                 {
                     return;
                 }
                 fightData.SetSuccess(true, time);
             }
         }
     }
 }
Пример #6
0
        private void DespawnLeft(float left, TRight right)
        {
            if (_objects.Count == 0)
            {
                return;
            }
            if (GetX(_objects.First.Value) > left - BufferZone)
            {
                return;
            }

            var before = Count;

            while (_objects.Count > 0 && GetX(_objects.First.Value) < left - TightBufferZone)
            {
                var obj = _objects.First.Value;
                _objects.RemoveFirst();
                DespawnEvent?.Invoke(obj, left, right);
            }

            if (Count < before)
            {
                Console.WriteLine($"{GetType().Name}: removed objects: {before}->{Count}");
            }
        }
Пример #7
0
        protected void TrimCombatReplay(ParsedLog log)
        {
            DespawnEvent despawnCheck = log.CombatData.GetDespawnEvents(AgentItem).LastOrDefault();
            SpawnEvent   spawnCheck   = log.CombatData.GetSpawnEvents(AgentItem).LastOrDefault();
            DeadEvent    deathCheck   = log.CombatData.GetDeadEvents(AgentItem).LastOrDefault();

            if (deathCheck != null)
            {
                CombatReplay.Trim(log.FightData.ToFightSpace(AgentItem.FirstAwareLogTime), deathCheck.Time);
            }
            else if (despawnCheck != null && (spawnCheck == null || spawnCheck.Time < despawnCheck.Time))
            {
                CombatReplay.Trim(log.FightData.ToFightSpace(AgentItem.FirstAwareLogTime), despawnCheck.Time);
            }
            else
            {
                CombatReplay.Trim(log.FightData.ToFightSpace(AgentItem.FirstAwareLogTime), log.FightData.ToFightSpace(AgentItem.LastAwareLogTime));
            }
        }
Пример #8
0
        protected static void TrimCombatReplay(ParsedEvtcLog log, CombatReplay replay, AgentItem agentItem)
        {
            // Trim
            DespawnEvent despawnCheck = log.CombatData.GetDespawnEvents(agentItem).LastOrDefault();
            SpawnEvent   spawnCheck   = log.CombatData.GetSpawnEvents(agentItem).LastOrDefault();
            DeadEvent    deathCheck   = log.CombatData.GetDeadEvents(agentItem).LastOrDefault();
            AliveEvent   aliveCheck   = log.CombatData.GetAliveEvents(agentItem).LastOrDefault();

            if (deathCheck != null && (aliveCheck == null || aliveCheck.Time < deathCheck.Time))
            {
                replay.Trim(agentItem.FirstAware, deathCheck.Time);
            }
            else if (despawnCheck != null && (spawnCheck == null || spawnCheck.Time < despawnCheck.Time))
            {
                replay.Trim(agentItem.FirstAware, despawnCheck.Time);
            }
            else
            {
                replay.Trim(agentItem.FirstAware, agentItem.LastAware);
            }
        }
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            var subPhasesData       = new List <(long start, long end, string name, NPC target, bool canBeSubPhase)>();

            foreach (NPC target in Targets)
            {
                long mainPhaseEnd = Math.Min(target.LastAware, log.FightData.FightEnd);
                switch (target.ID)
                {
                case (int)ArcDPSEnums.TrashID.VoidSaltsprayDragon:
                case (int)ArcDPSEnums.TrashID.VoidTimeCaster:
                case (int)ArcDPSEnums.TrashID.VoidObliterator:
                case (int)ArcDPSEnums.TrashID.VoidGoliath:
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, target.Character, target, false));
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidJormag:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Jormag", target, true));
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidKralkatorrik:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Kralkatorrik", target, true));
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidMordremoth:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Mordremoth", target, true));
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidPrimordus:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Primordus", target, true));
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidSooWon:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Soo-Won", target, true));
                    AttackTargetEvent attackTargetEvent = log.CombatData.GetAttackTargetEvents(target.AgentItem).FirstOrDefault();
                    if (attackTargetEvent != null)
                    {
                        var targetables = log.CombatData.GetTargetableEvents(attackTargetEvent.AttackTarget).Where(x => x.Time >= target.FirstAware).ToList();
                        var targetOns   = targetables.Where(x => x.Targetable).ToList();
                        var targetOffs  = targetables.Where(x => !x.Targetable).ToList();
                        int id          = 0;
                        foreach (TargetableEvent targetOn in targetOns)
                        {
                            long            start     = targetOn.Time;
                            long            end       = log.FightData.FightEnd;
                            TargetableEvent targetOff = targetOffs.FirstOrDefault(x => x.Time > start);
                            if (targetOff != null)
                            {
                                end = targetOff.Time;
                            }
                            subPhasesData.Add((start, end, "Soo-Won " + (++id), target, true));
                        }
                    }
                    break;

                case (int)ArcDPSEnums.TargetID.TheDragonVoidZhaitan:
                    phases[0].AddTarget(target);
                    subPhasesData.Add((target.FirstAware, mainPhaseEnd, "Zhaitan", target, true));
                    break;

                case (int)ArcDPSEnums.TargetID.DummyTarget:
                    phases[0].AddTarget(target);
                    break;
                }
            }
            if (!requirePhases)
            {
                return(phases);
            }
            foreach ((long start, long end, string name, NPC target, bool canBeSubPhase) in subPhasesData)
            {
                var subPhase = new PhaseData(start, end, name);
                subPhase.CanBeSubPhase = canBeSubPhase;
                subPhase.AddTarget(target);
                phases.Add(subPhase);
            }
            int purificationID = 0;

            foreach (NPC voidAmal in Targets.Where(x => x.ID == (int)ArcDPSEnums.TrashID.PushableVoidAmalgamate || x.ID == (int)ArcDPSEnums.TrashID.KillableVoidAmalgamate))
            {
                long      end;
                DeadEvent deadEvent = log.CombatData.GetDeadEvents(voidAmal.AgentItem).LastOrDefault();
                if (deadEvent == null)
                {
                    DespawnEvent despawnEvent = log.CombatData.GetDespawnEvents(voidAmal.AgentItem).LastOrDefault();
                    if (despawnEvent == null)
                    {
                        end = voidAmal.LastAware;
                    }
                    else
                    {
                        end = despawnEvent.Time;
                    }
                }
                else
                {
                    end = deadEvent.Time;
                }
                var purificationPhase = new PhaseData(Math.Max(voidAmal.FirstAware, 0), Math.Min(end, log.FightData.FightEnd), "Purification " + (++purificationID));
                purificationPhase.AddTarget(voidAmal);
                phases.Add(purificationPhase);
            }
            return(phases);
        }
Пример #10
0
 public void Despawn()
 {
     DespawnEvent.Invoke(this);
 }