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); } } } }
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); }
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); }
/// <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); } } } }
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}"); } }
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)); } }
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); }
public void Despawn() { DespawnEvent.Invoke(this); }