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); } }
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)); } } } } } }
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); } } }
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); }
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)); }
public List <CombatItem> GetDamageTakenData(ushort key) { return(CombatData.GetDamageTakenData(key)); }