public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData) { AgentItem target = agentData.GetAgentsByID(TriggerID).FirstOrDefault(); foreach (CombatItem c in combatData) { // redirect all attacks to the main golem if (c.DstAgent == 0 && c.DstInstid == 0 && c.IsStateChange == ParseEnum.StateChange.None && c.IFF == ParseEnum.IFF.Foe && c.IsActivation == ParseEnum.Activation.None && c.IsBuffRemove == ParseEnum.BuffRemove.None) { c.OverrideDstValues(target.Agent, target.InstID); } } CombatItem pov = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.PointOfView); if (pov != null) { // to make sure that the logging starts when the PoV starts attacking (in case there is a slave with them) CombatItem enterCombat = combatData.FirstOrDefault(x => x.SrcAgent == pov.SrcAgent && x.IsStateChange == ParseEnum.StateChange.EnterCombat); if (enterCombat != null) { fightData.OverrideStart(enterCombat.LogTime); } } ComputeFightTargets(agentData, combatData); }
protected void ComputeFightTargets(AgentData agentData, List <CombatItem> combatItems) { foreach (ushort id in GetUniqueTargetIDs()) { RegroupTargetsByID(id, agentData, combatItems); } List <ushort> ids = GetFightTargetsIDs(); foreach (ushort id in ids) { List <AgentItem> agents = agentData.GetAgentsByID(id); foreach (AgentItem agentItem in agents) { Targets.Add(new Target(agentItem)); } } List <ParseEnum.TrashIDS> ids2 = GetTrashMobsIDS(); List <AgentItem> aList = agentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids2.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList(); foreach (AgentItem a in aList) { Mob mob = new Mob(a); TrashMobs.Add(mob); } }
private void RegroupTargetsByID(ushort id, AgentData agentData, List <CombatItem> combatItems) { List <AgentItem> agents = agentData.GetAgentsByID(id); if (agents.Count > 1) { AgentItem firstItem = agents.First(); HashSet <ulong> agentValues = new HashSet <ulong>(agents.Select(x => x.Agent)); AgentItem newTargetAgent = new AgentItem(firstItem) { FirstAwareLogTime = agents.Min(x => x.FirstAwareLogTime), LastAwareLogTime = agents.Max(x => x.LastAwareLogTime) }; // get unique id for the fusion ushort instID = 0; Random rnd = new Random(); while (agentData.InstIDValues.Contains(instID) || instID == 0) { instID = (ushort)rnd.Next(ushort.MaxValue / 2, ushort.MaxValue); } newTargetAgent.InstID = instID; agentData.OverrideID(id, newTargetAgent); foreach (CombatItem c in combatItems) { if (agentValues.Contains(c.SrcAgent)) { c.OverrideSrcValues(newTargetAgent.Agent, newTargetAgent.InstID); } if (agentValues.Contains(c.DstAgent)) { c.OverrideDstValues(newTargetAgent.Agent, newTargetAgent.InstID); } } } }
public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData) { // The walls spawn at the start of the encounter, we fix it by overriding their first aware to the first velocity change event List <AgentItem> riverOfSouls = agentData.GetAgentsByID((ushort)RiverOfSouls); bool sortCombatList = false; foreach (AgentItem riverOfSoul in riverOfSouls) { CombatItem firstMovement = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.Velocity && x.SrcInstid == riverOfSoul.InstID && x.LogTime <= riverOfSoul.LastAwareLogTime); if (firstMovement != null) { // update start riverOfSoul.FirstAwareLogTime = firstMovement.LogTime - 10; foreach (CombatItem c in combatData) { if (c.SrcInstid == riverOfSoul.InstID && c.LogTime < riverOfSoul.FirstAwareLogTime && (c.IsStateChange == ParseEnum.StateChange.Position || c.IsStateChange == ParseEnum.StateChange.Rotation)) { sortCombatList = true; c.OverrideTime(riverOfSoul.FirstAwareLogTime); } } } else { // otherwise remove the agent from the pool agentData.RemoveAgent(riverOfSoul); } } // make sure the list is still sorted by time after overrides if (sortCombatList) { combatData.Sort((x, y) => x.LogTime.CompareTo(y.LogTime)); } ComputeFightTargets(agentData, combatData); }
public void ComputeFightTargets(AgentData agentData, FightData fightData, List <CombatItem> combatItems) { List <ushort> ids = GetFightTargetsIDs(); foreach (ushort id in ids) { List <AgentItem> agents = agentData.GetAgentsByID(id); foreach (AgentItem agentItem in agents) { Targets.Add(new Boss(agentItem)); } } RegroupTargets(agentData, combatItems); }
public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents) { base.CheckSuccess(combatData, agentData, fightData, playerAgents); if (!fightData.Success) { List <AgentItem> prisoners = agentData.GetAgentsByID((ushort)Prisoner2); List <DeadEvent> prisonerDeaths = new List <DeadEvent>(); foreach (AgentItem prisoner in prisoners) { prisonerDeaths.AddRange(combatData.GetDeadEvents(prisoner)); } if (prisonerDeaths.Count == 0) { SetSuccessByCombatExit(new HashSet <ushort>(GetSuccessCheckIds()), combatData, fightData, playerAgents); } } }
public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData) { // Find target AgentItem target = agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.Ensolyss).FirstOrDefault(); if (target == null) { throw new InvalidOperationException("Main target of the fight not found"); } // enter combat CombatItem invulLost = combatData.FirstOrDefault(x => x.DstInstid == target.InstID && x.IsStateChange == ParseEnum.StateChange.None && x.IsBuffRemove != ParseEnum.BuffRemove.None && x.SkillID == 762); if (invulLost != null && invulLost.LogTime - fightData.FightStartLogTime < 5000) { fightData.OverrideStart(invulLost.LogTime); } ComputeFightTargets(agentData, combatData); }
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)); } } }
protected void RegroupTargetsByID(ushort id, AgentData agentData, List <CombatItem> combatItems) { List <AgentItem> agents = agentData.GetAgentsByID(id); List <Boss> toRegroup = Targets.Where(x => x.ID == id).ToList(); if (agents.Count > 0 && toRegroup.Count > 0) { Targets.RemoveAll(x => x.ID == id); AgentItem firstItem = agents.First(); agents = agents.Where(x => x.InstID == firstItem.InstID).ToList(); HashSet <ulong> agentValues = new HashSet <ulong>(agents.Select(x => x.Agent)); agentValues.Remove(firstItem.Agent); AgentItem newTargetAgent = new AgentItem(firstItem) { FirstAware = agents.Min(x => x.FirstAware), LastAware = agents.Max(x => x.LastAware) }; agentData.OverrideID(id, firstItem.InstID, newTargetAgent); Targets.Add(new Boss(newTargetAgent)); if (agentValues.Count == 0) { return; } foreach (CombatItem c in combatItems) { if (agentValues.Contains(c.SrcAgent)) { c.SrcAgent = newTargetAgent.Agent; } if (agentValues.Contains(c.DstAgent)) { c.DstAgent = newTargetAgent.Agent; } } } }
public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData) { // find target AgentItem target = agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.Xera).FirstOrDefault(); if (target == null) { throw new InvalidOperationException("Main target of the fight not found"); } // enter combat CombatItem enterCombat = combatData.Find(x => x.SrcInstid == target.InstID && x.IsStateChange == ParseEnum.StateChange.EnterCombat); if (enterCombat != null) { fightData.OverrideStart(enterCombat.LogTime); } // find split foreach (AgentItem NPC in agentData.GetAgentByType(AgentItem.AgentType.NPC)) { if (NPC.ID == 16286) { CombatItem move = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.Position && x.SrcInstid == NPC.InstID && x.LogTime >= NPC.FirstAwareLogTime + 500 && x.LogTime <= NPC.LastAwareLogTime); if (move != null) { _specialSplitLogTime = move.LogTime; } else { _specialSplitLogTime = NPC.FirstAwareLogTime; } target.LastAwareLogTime = NPC.LastAwareLogTime; // get unique id for the fusion ushort instID = 0; Random rnd = new Random(); while (agentData.InstIDValues.Contains(instID) || instID == 0) { instID = (ushort)rnd.Next(ushort.MaxValue / 2, ushort.MaxValue); } target.InstID = instID; agentData.Refresh(); HashSet <ulong> agents = new HashSet <ulong>() { NPC.Agent, target.Agent }; // update combat data foreach (CombatItem c in combatData) { if (agents.Contains(c.SrcAgent)) { c.OverrideSrcValues(target.Agent, target.InstID); } if (agents.Contains(c.DstAgent)) { c.OverrideDstValues(target.Agent, target.InstID); } } break; } } ComputeFightTargets(agentData, combatData); }