internal override void EIEvtcParse(ulong gw2Build, FightData fightData, AgentData agentData, List <CombatItem> combatData, List <AbstractSingleActor> friendlies, IReadOnlyDictionary <uint, AbstractExtensionHandler> extensions) { // has breakbar state into if (combatData.Any(x => x.IsStateChange == ArcDPSEnums.StateChange.BreakbarState)) { long sacrificeID = 34442; var sacrificeList = combatData.Where(x => x.SkillID == sacrificeID && !x.IsExtension && (x.IsBuffRemove == ArcDPSEnums.BuffRemove.All || x.IsBuffApply())).ToList(); var sacrificeStartList = sacrificeList.Where(x => x.IsBuffRemove == ArcDPSEnums.BuffRemove.None).ToList(); var sacrificeEndList = sacrificeList.Where(x => x.IsBuffRemove == ArcDPSEnums.BuffRemove.All).ToList(); var copies = new List <CombatItem>(); for (int i = 0; i < sacrificeStartList.Count; i++) { // long sacrificeStartTime = sacrificeStartList[i].Time; long sacrificeEndTime = i < sacrificeEndList.Count ? sacrificeEndList[i].Time : fightData.FightEnd; // Player sacrifice = friendlies.OfType <Player>().FirstOrDefault(x => x.AgentItem == agentData.GetAgent(sacrificeStartList[i].DstAgent, sacrificeStartList[i].Time)); if (sacrifice == null) { continue; } AgentItem sacrificeCrystal = agentData.AddCustomAgent(sacrificeStartTime, sacrificeEndTime + 100, AgentItem.AgentType.NPC, "Sacrificed " + (i + 1) + " " + sacrifice.Character, sacrifice.Spec, (int)ArcDPSEnums.TrashID.MatthiasSacrificeCrystal, false); foreach (CombatItem cbt in combatData) { if (!sacrificeCrystal.InAwareTimes(cbt.Time)) { continue; } bool skip = !(cbt.DstMatchesAgent(sacrifice.AgentItem, extensions) || cbt.SrcMatchesAgent(sacrifice.AgentItem, extensions)); if (skip) { continue; } // redirect damage events if (cbt.IsDamage(extensions)) { // only redirect incoming damage if (cbt.DstMatchesAgent(sacrifice.AgentItem, extensions)) { cbt.OverrideDstAgent(sacrificeCrystal.Agent); } } // copy the rest else { var copy = new CombatItem(cbt); if (copy.DstMatchesAgent(sacrifice.AgentItem, extensions)) { copy.OverrideDstAgent(sacrificeCrystal.Agent); } if (copy.SrcMatchesAgent(sacrifice.AgentItem, extensions)) { copy.OverrideSrcAgent(sacrificeCrystal.Agent); } copies.Add(copy); } } } if (copies.Any()) { combatData.AddRange(copies); } } ComputeFightTargets(agentData, combatData, extensions); foreach (AbstractSingleActor target in Targets) { if (target.ID == (int)ArcDPSEnums.TrashID.MatthiasSacrificeCrystal) { target.SetManualHealth(100000); } } }
internal BuffRemoveManualEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData) { }
internal AttackTargetEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem, agentData) { AttackTarget = Src; Src = agentData.GetAgent(evtcItem.DstAgent, evtcItem.Time); }
internal override void EIEvtcParse(ulong gw2Build, FightData fightData, AgentData agentData, List <CombatItem> combatData, List <AbstractSingleActor> friendlies, IReadOnlyDictionary <uint, AbstractExtensionHandler> extensions) { // find target AgentItem firstXera = agentData.GetNPCsByID((int)ArcDPSEnums.TargetID.Xera).FirstOrDefault(); if (firstXera == null) { throw new MissingKeyActorsException("Xera not found"); } _xeraFirstPhaseEndTime = firstXera.LastAware; // var maxHPUpdates = combatData.Where(x => x.IsStateChange == ArcDPSEnums.StateChange.MaxHealthUpdate && x.DstAgent > 0).ToList(); // var bloodstoneFragments = maxHPUpdates.Where(x => x.DstAgent == 104580).Select(x => agentData.GetAgent(x.SrcAgent, x.Time)).Where(x => x.Type == AgentItem.AgentType.Gadget).ToList(); foreach (AgentItem gadget in bloodstoneFragments) { gadget.OverrideType(AgentItem.AgentType.NPC); gadget.OverrideID(ArcDPSEnums.TrashID.BloodstoneFragment); } // var bloodstoneShards = maxHPUpdates.Where(x => x.DstAgent == 343620).Select(x => agentData.GetAgent(x.SrcAgent, x.Time)).Where(x => x.Type == AgentItem.AgentType.Gadget).ToList(); foreach (AgentItem gadget in bloodstoneShards) { gadget.OverrideType(AgentItem.AgentType.NPC); gadget.OverrideID(ArcDPSEnums.TrashID.BloodstoneShard); } // var chargedBloodStones = maxHPUpdates.Where(x => x.DstAgent == 74700).Select(x => agentData.GetAgent(x.SrcAgent, x.Time)).Where(x => x.Type == AgentItem.AgentType.Gadget && x.LastAware > firstXera.LastAware).ToList(); foreach (AgentItem gadget in chargedBloodStones) { gadget.OverrideType(AgentItem.AgentType.NPC); gadget.OverrideID(ArcDPSEnums.TrashID.ChargedBloodstone); } if (bloodstoneFragments.Any() || bloodstoneShards.Any() || chargedBloodStones.Any()) { agentData.Refresh(); } // find split AgentItem secondXera = agentData.GetNPCsByID(16286).FirstOrDefault(); if (secondXera != null) { CombatItem move = combatData.FirstOrDefault(x => x.IsStateChange == ArcDPSEnums.StateChange.Position && x.SrcMatchesAgent(secondXera) && x.Time >= secondXera.FirstAware + 500); if (move != null) { _xeraSecondPhaseStartTime = move.Time; } else { _xeraSecondPhaseStartTime = secondXera.FirstAware; } firstXera.OverrideAwareTimes(firstXera.FirstAware, secondXera.LastAware); agentData.SwapMasters(secondXera, firstXera); // update combat data foreach (CombatItem c in combatData) { if (c.SrcMatchesAgent(secondXera, extensions)) { c.OverrideSrcAgent(firstXera.Agent); } if (c.DstMatchesAgent(secondXera, extensions)) { c.OverrideDstAgent(firstXera.Agent); } } } ComputeFightTargets(agentData, combatData, extensions); if (_xeraSecondPhaseStartTime > 0) { AbstractSingleActor mainTarget = GetMainTarget(); if (mainTarget == null) { throw new MissingKeyActorsException("Xera not found"); } mainTarget.SetManualHealth(24085950); } }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Boss mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.BossIDS.Deimos); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Determined + additional data on inst change CombatItem invulDei = log.GetBoonData(762).Find(x => x.IsBuffRemove == ParseEnum.BuffRemove.None && x.DstInstid == mainTarget.InstID); if (invulDei != null) { end = invulDei.Time - log.FightData.FightStart; phases.Add(new PhaseData(start, end)); start = (log.FightData.PhaseData.Count == 1 ? log.FightData.PhaseData[0] - log.FightData.FightStart : fightDuration); mainTarget.AddCustomCastLog(new CastLog(end, -6, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } for (int i = 1; i < phases.Count; i++) { phases[i].Name = "Phase " + i; phases[i].Targets.Add(mainTarget); if (i == 2) { phases[i].DrawArea = true; } } int offsetDei = phases.Count; CombatItem teleport = log.GetBoonData(38169).FirstOrDefault(x => x.Time > log.FightData.FightStart); int splits = 0; while (teleport != null && splits < 3) { start = teleport.Time - log.FightData.FightStart; CombatItem teleportBack = log.GetBoonData(38169).FirstOrDefault(x => x.Time - log.FightData.FightStart > start + 10000); if (teleportBack != null) { end = Math.Min(teleportBack.Time - log.FightData.FightStart, fightDuration); } else { end = fightDuration; } phases.Add(new PhaseData(start, end)); splits++; teleport = log.GetBoonData(38169).FirstOrDefault(x => x.Time - log.FightData.FightStart > end + 10000); } string[] namesDeiSplit = new [] { "Thief", "Gambler", "Drunkard" }; for (int i = offsetDei; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesDeiSplit[i - offsetDei]; phase.DrawArea = true; List <ushort> ids = new List <ushort> { (ushort)Thief, (ushort)Drunkard, (ushort)Gambler, }; AddTargetsToPhase(phase, ids, log); } phases.Sort((x, y) => (x.Start < y.Start) ? -1 : 1); foreach (PhaseData phase in phases) { phase.DrawStart = true; phase.DrawEnd = true; } phases.RemoveAll(x => x.Targets.Count == 0); return(phases); }
internal PointOfViewEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem) { PoV = agentData.GetAgent(evtcItem.SrcAgent, evtcItem.Time); }
public static void AddStateChangeEvent(CombatItem stateChangeEvent, AgentData agentData, SkillData skillData, MetaEventsContainer metaDataEvents, StatusEventsContainer statusEvents, List <RewardEvent> rewardEvents, List <WeaponSwapEvent> wepSwaps, List <AbstractBuffEvent> buffEvents, int evtcVersion) { switch (stateChangeEvent.IsStateChange) { case ArcDPSEnums.StateChange.EnterCombat: var enterCombatEvt = new EnterCombatEvent(stateChangeEvent, agentData); Add(statusEvents.EnterCombatEvents, enterCombatEvt.Src, enterCombatEvt); break; case ArcDPSEnums.StateChange.ExitCombat: var exitCombatEvt = new ExitCombatEvent(stateChangeEvent, agentData); Add(statusEvents.ExitCombatEvents, exitCombatEvt.Src, exitCombatEvt); break; case ArcDPSEnums.StateChange.ChangeUp: var aliveEvt = new AliveEvent(stateChangeEvent, agentData); Add(statusEvents.AliveEvents, aliveEvt.Src, aliveEvt); break; case ArcDPSEnums.StateChange.ChangeDead: var deadEvt = new DeadEvent(stateChangeEvent, agentData); Add(statusEvents.DeadEvents, deadEvt.Src, deadEvt); break; case ArcDPSEnums.StateChange.ChangeDown: var downEvt = new DownEvent(stateChangeEvent, agentData); Add(statusEvents.DownEvents, downEvt.Src, downEvt); break; case ArcDPSEnums.StateChange.Spawn: var spawnEvt = new SpawnEvent(stateChangeEvent, agentData); Add(statusEvents.SpawnEvents, spawnEvt.Src, spawnEvt); break; case ArcDPSEnums.StateChange.Despawn: var despawnEvt = new DespawnEvent(stateChangeEvent, agentData); Add(statusEvents.DespawnEvents, despawnEvt.Src, despawnEvt); break; case ArcDPSEnums.StateChange.HealthUpdate: var healthEvt = new HealthUpdateEvent(stateChangeEvent, agentData); Add(statusEvents.HealthUpdateEvents, healthEvt.Src, healthEvt); break; case ArcDPSEnums.StateChange.BarrierUpdate: var barrierEvt = new BarrierUpdateEvent(stateChangeEvent, agentData); Add(statusEvents.BarrierUpdateEvents, barrierEvt.Src, barrierEvt); break; case ArcDPSEnums.StateChange.InstanceStart: metaDataEvents.InstanceStartEvent = new InstanceStartEvent(stateChangeEvent); break; case ArcDPSEnums.StateChange.LogStart: if (stateChangeEvent.Value == 0 || stateChangeEvent.BuffDmg == 0) { return; } metaDataEvents.LogStartEvent = new LogStartEvent(stateChangeEvent); break; case ArcDPSEnums.StateChange.LogEnd: if (stateChangeEvent.Value == 0 || stateChangeEvent.BuffDmg == 0) { return; } metaDataEvents.LogEndEvent = new LogEndEvent(stateChangeEvent); break; case ArcDPSEnums.StateChange.MaxHealthUpdate: var maxHealthEvt = new MaxHealthUpdateEvent(stateChangeEvent, agentData); Add(statusEvents.MaxHealthUpdateEvents, maxHealthEvt.Src, maxHealthEvt); break; case ArcDPSEnums.StateChange.PointOfView: if (stateChangeEvent.SrcAgent == 0) { return; } metaDataEvents.PointOfViewEvent = new PointOfViewEvent(stateChangeEvent, agentData); break; case ArcDPSEnums.StateChange.Language: metaDataEvents.LanguageEvent = new LanguageEvent(stateChangeEvent); break; case ArcDPSEnums.StateChange.GWBuild: if (stateChangeEvent.SrcAgent == 0) { return; } metaDataEvents.BuildEvent = new BuildEvent(stateChangeEvent); break; case ArcDPSEnums.StateChange.ShardId: metaDataEvents.ShardEvents.Add(new ShardEvent(stateChangeEvent)); break; case ArcDPSEnums.StateChange.Reward: #if !NO_REWARDS rewardEvents.Add(new RewardEvent(stateChangeEvent)); #endif break; case ArcDPSEnums.StateChange.TeamChange: var tcEvt = new TeamChangeEvent(stateChangeEvent, agentData); Add(statusEvents.TeamChangeEvents, tcEvt.Src, tcEvt); break; case ArcDPSEnums.StateChange.AttackTarget: var aTEvt = new AttackTargetEvent(stateChangeEvent, agentData); Add(statusEvents.AttackTargetEvents, aTEvt.Src, aTEvt); Add(statusEvents.AttackTargetEventsByAttackTarget, aTEvt.AttackTarget, aTEvt); break; case ArcDPSEnums.StateChange.Targetable: var tarEvt = new TargetableEvent(stateChangeEvent, agentData); Add(statusEvents.TargetableEvents, tarEvt.Src, tarEvt); break; case ArcDPSEnums.StateChange.MapID: metaDataEvents.MapIDEvents.Add(new MapIDEvent(stateChangeEvent)); break; case ArcDPSEnums.StateChange.Guild: var gEvt = new GuildEvent(stateChangeEvent, agentData); Add(metaDataEvents.GuildEvents, gEvt.Src, gEvt); break; case ArcDPSEnums.StateChange.BuffInfo: case ArcDPSEnums.StateChange.BuffFormula: if (metaDataEvents.BuffInfoEvents.TryGetValue(stateChangeEvent.SkillID, out BuffInfoEvent buffInfoEvent)) { buffInfoEvent.CompleteBuffInfoEvent(stateChangeEvent, evtcVersion); } else { buffInfoEvent = new BuffInfoEvent(stateChangeEvent, evtcVersion); metaDataEvents.BuffInfoEvents[stateChangeEvent.SkillID] = buffInfoEvent; } if (stateChangeEvent.IsStateChange == ArcDPSEnums.StateChange.BuffInfo) { if (metaDataEvents.BuffInfoEventsByCategory.TryGetValue(buffInfoEvent.Category, out List <BuffInfoEvent> bdEvtList)) { bdEvtList.Add(buffInfoEvent); } else { metaDataEvents.BuffInfoEventsByCategory[buffInfoEvent.Category] = new List <BuffInfoEvent> { buffInfoEvent }; } } break; case ArcDPSEnums.StateChange.SkillInfo: case ArcDPSEnums.StateChange.SkillTiming: if (metaDataEvents.SkillInfoEvents.TryGetValue(stateChangeEvent.SkillID, out SkillInfoEvent skillInfoEvent)) { skillInfoEvent.CompleteSkillInfoEvent(stateChangeEvent); } else { skillInfoEvent = new SkillInfoEvent(stateChangeEvent); metaDataEvents.SkillInfoEvents[stateChangeEvent.SkillID] = skillInfoEvent; } break; case ArcDPSEnums.StateChange.BreakbarState: var bSEvt = new BreakbarStateEvent(stateChangeEvent, agentData); Add(statusEvents.BreakbarStateEvents, bSEvt.Src, bSEvt); break; case ArcDPSEnums.StateChange.BreakbarPercent: var bPEvt = new BreakbarPercentEvent(stateChangeEvent, agentData); Add(statusEvents.BreakbarPercentEvents, bPEvt.Src, bPEvt); break; case ArcDPSEnums.StateChange.Error: metaDataEvents.ErrorEvents.Add(new ErrorEvent(stateChangeEvent)); break; case ArcDPSEnums.StateChange.Tag: var tagEvent = new TagEvent(stateChangeEvent, agentData); Add(statusEvents.TagEvents, tagEvent.Src, tagEvent); break; case ArcDPSEnums.StateChange.Velocity: var velEvt = new VelocityEvent(stateChangeEvent, agentData); Add(statusEvents.MovementEvents, velEvt.Src, velEvt); break; case ArcDPSEnums.StateChange.Rotation: var rotEvt = new RotationEvent(stateChangeEvent, agentData); Add(statusEvents.MovementEvents, rotEvt.Src, rotEvt); break; case ArcDPSEnums.StateChange.Position: var posEvt = new PositionEvent(stateChangeEvent, agentData); Add(statusEvents.MovementEvents, posEvt.Src, posEvt); break; case ArcDPSEnums.StateChange.WeaponSwap: wepSwaps.Add(new WeaponSwapEvent(stateChangeEvent, agentData, skillData)); break; case ArcDPSEnums.StateChange.StackActive: buffEvents.Add(new BuffStackActiveEvent(stateChangeEvent, agentData, skillData)); break; case ArcDPSEnums.StateChange.StackReset: buffEvents.Add(new BuffStackResetEvent(stateChangeEvent, agentData, skillData)); break; case ArcDPSEnums.StateChange.BuffInitial: buffEvents.Add(new BuffApplyEvent(stateChangeEvent, agentData, skillData)); break; case ArcDPSEnums.StateChange.Effect: var effectEvt = new EffectEvent(stateChangeEvent, agentData); statusEvents.EffectEvents.Add(effectEvt); Add(statusEvents.EffectEventsByID, effectEvt.EffectID, effectEvt); Add(statusEvents.EffectEventsBySrc, effectEvt.Src, effectEvt); if (effectEvt.IsAroundDst) { Add(statusEvents.EffectEventsByDst, effectEvt.Dst, effectEvt); } break; case ArcDPSEnums.StateChange.EffectIDToGUID: if (evtcVersion >= ParserHelper.ArcDPSBuilds.FunctionalIDToGUIDEvents) { switch (ArcDPSEnums.GetContentLocal((byte)stateChangeEvent.OverstackValue)) { case ArcDPSEnums.ContentLocal.Effect: var effectGUID = new EffectGUIDEvent(stateChangeEvent); metaDataEvents.EffectGUIDEventsByEffectID[effectGUID.ContentID] = effectGUID; metaDataEvents.EffectGUIDEventsByGUID[effectGUID.ContentGUID] = effectGUID; break; case ArcDPSEnums.ContentLocal.Marker: var markerGUID = new MarkerGUIDEvent(stateChangeEvent); metaDataEvents.MarkerGUIDEventsByMarkerID[markerGUID.ContentID] = markerGUID; metaDataEvents.MarkerGUIDEventsByGUID[markerGUID.ContentGUID] = markerGUID; break; default: break; } } break; default: break; } }
public void SetItem(CombatItem itemToUse) { Item = itemToUse; Targets.Clear(); }
public AbstractMovementEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem.Time) { AgentItem = agentData.GetAgent(evtcItem.SrcAgent); _dstAgent = evtcItem.DstAgent; _value = evtcItem.Value; }
private void CompletePlayers() { //Fix Disconnected players var playerAgentList = _agentData.GetAgentByType(AgentItem.AgentType.Player); foreach (AgentItem playerAgent in playerAgentList) { if (playerAgent.InstID == 0 || playerAgent.FirstAware == 0 || playerAgent.LastAware == long.MaxValue) { CombatItem tst = _combatItems.Find(x => x.SrcAgent == playerAgent.Agent); if (tst == null) { tst = _combatItems.Find(x => x.DstAgent == playerAgent.Agent); if (tst == null) { continue; } playerAgent.InstID = tst.DstInstid; } else { playerAgent.InstID = tst.SrcInstid; } playerAgent.FirstAware = _fightData.FightStart; playerAgent.LastAware = _fightData.FightEnd; } try { bool skip = false; Player player = new Player(playerAgent, _fightData.Logic.Mode == FightLogic.ParseMode.Fractal); foreach (Player p in _playerList) { if (p.Account == player.Account) // same player { if (p.Character == player.Character) // same character, can be fused { skip = true; Random rnd = new Random(); ulong agent = 0; while (_agentData.AgentValues.Contains(agent) || agent == 0) { agent = (ulong)rnd.Next(Int32.MaxValue / 2, Int32.MaxValue); } ushort instid = 0; while (_agentData.InstIDValues.Contains(instid) || instid == 0) { instid = (ushort)rnd.Next(ushort.MaxValue / 2, ushort.MaxValue); } foreach (CombatItem c in _combatItems) { if (c.DstAgent == p.Agent || player.Agent == c.DstAgent) { c.OverrideDstValues(agent, instid); } if (c.SrcAgent == p.Agent || player.Agent == c.SrcAgent) { c.OverrideSrcValues(agent, instid); } } p.AgentItem.InstID = instid; p.AgentItem.Agent = agent; p.AgentItem.FirstAware = Math.Min(p.AgentItem.FirstAware, player.AgentItem.FirstAware); p.AgentItem.LastAware = Math.Max(p.AgentItem.LastAware, player.AgentItem.LastAware); _agentData.Refresh(); break; } // different character in raid mode, discard it as it can't have any influence, otherwise add as a separate entity else if (_fightData.Logic.Mode == FightLogic.ParseMode.Raid) { skip = true; break; } } } if (!skip) { _playerList.Add(player); } } catch (InvalidPlayerException ex) { if (_fightData.Logic.Mode != FightLogic.ParseMode.WvW) { throw ex; } // the players are enemy /*if (!ex.Squadless) * { * _fightData.Logic.Targets.Add(new Target(playerAgent)); * }*/ } } }
public LogEndEvent(CombatItem evtcItem) : base(evtcItem) { }
internal AbstractBuffRemoveEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, skillData) { RemovedDuration = evtcItem.Value; InternalBy = agentData.GetAgent(evtcItem.DstAgent); To = agentData.GetAgent(evtcItem.SrcAgent); }
public EffectUseRestore(EffectUseRestoreData data, CombatItem item) : base(data, item) { this.data = data; }
public HealthUpdateEvent(CombatItem evtcItem, AgentData agentData, long offset) : base(evtcItem, agentData, offset) { HPPercent = evtcItem.DstAgent / 100.0; }
public override void ComputeAdditionalPlayerData(Player p, ParsedLog log) { // spirit transform CombatReplay replay = p.CombatReplay; List <CombatItem> spiritTransform = log.CombatData.GetBoonData(46950).Where(x => x.DstInstid == p.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.None).ToList(); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Dhuum); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } foreach (CombatItem c in spiritTransform) { int duration = 15000; if (mainTarget.HealthOverTime.FirstOrDefault(x => x.logTime > c.Time).hp < 1050) { duration = 30000; } CombatItem removedBuff = log.CombatData.GetBoonData(48281).FirstOrDefault(x => x.SrcInstid == p.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.All && x.Time > c.Time && x.Time < c.Time + duration); int start = (int)(log.FightData.ToFightSpace(c.Time)); int end = start + duration; if (removedBuff != null) { end = (int)(log.FightData.ToFightSpace(removedBuff.Time)); } replay.Actors.Add(new CircleActor(true, 0, 100, (start, end), "rgba(0, 50, 200, 0.3)", new AgentConnector(p))); replay.Actors.Add(new CircleActor(true, start + duration, 100, (start, end), "rgba(0, 50, 200, 0.5)", new AgentConnector(p))); } // bomb List <CombatItem> bombDhuum = GetFilteredList(log, 47646, p, true); int bombDhuumStart = 0; foreach (CombatItem c in bombDhuum) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { bombDhuumStart = (int)(log.FightData.ToFightSpace(c.Time)); } else { int bombDhuumEnd = (int)(log.FightData.ToFightSpace(c.Time)); replay.Actors.Add(new CircleActor(true, 0, 100, (bombDhuumStart, bombDhuumEnd), "rgba(80, 180, 0, 0.3)", new AgentConnector(p))); replay.Actors.Add(new CircleActor(true, bombDhuumStart + 13000, 100, (bombDhuumStart, bombDhuumEnd), "rgba(80, 180, 0, 0.5)", new AgentConnector(p))); } } // shackles connection List <CombatItem> shackles = GetFilteredList(log, 47335, p, true).Concat(GetFilteredList(log, 48591, p, true)).ToList(); int shacklesStart = 0; Player shacklesTarget = null; foreach (CombatItem c in shackles) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { shacklesStart = (int)(log.FightData.ToFightSpace(c.Time)); shacklesTarget = log.PlayerList.FirstOrDefault(x => x.Agent == c.SrcAgent); } else { int shacklesEnd = (int)(log.FightData.ToFightSpace(c.Time)); if (shacklesTarget != null) { replay.Actors.Add(new LineActor(0, (shacklesStart, shacklesEnd), "rgba(0, 255, 255, 0.5)", new AgentConnector(p), new AgentConnector(shacklesTarget))); } } } // shackles damage (identical to the connection for now, not yet properly distinguishable from the pure connection, further investigation needed due to inconsistent behavior (triggering too early, not triggering the damaging skill though) // shackles start with buff 47335 applied from one player to the other, this is switched over to buff 48591 after mostly 2 seconds, sometimes later. This is switched to 48042 usually 4 seconds after initial application and the damaging skill 47164 starts to deal damage from that point on. // Before that point, 47164 is only logged when evaded/blocked, but doesn't deal damage. Further investigation needed. List <CombatItem> shacklesDmg = GetFilteredList(log, 48042, p, true); int shacklesDmgStart = 0; Player shacklesDmgTarget = null; foreach (CombatItem c in shacklesDmg) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { shacklesDmgStart = (int)(log.FightData.ToFightSpace(c.Time)); shacklesDmgTarget = log.PlayerList.FirstOrDefault(x => x.Agent == c.SrcAgent); } else { int shacklesDmgEnd = (int)(log.FightData.ToFightSpace(c.Time)); if (shacklesDmgTarget != null) { replay.Actors.Add(new LineActor(0, (shacklesDmgStart, shacklesDmgEnd), "rgba(0, 255, 255, 0.5)", new AgentConnector(p), new AgentConnector(shacklesDmgTarget))); } } } }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Boss mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.BossIDS.Sabetha); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Invul check List <CombatItem> invulsSab = GetFilteredList(log, 757, mainTarget); for (int i = 0; i < invulsSab.Count; i++) { CombatItem c = invulsSab[i]; if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { end = c.Time - log.FightData.FightStart; phases.Add(new PhaseData(start, end)); if (i == invulsSab.Count - 1) { mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(fightDuration - end), ParseEnum.Activation.None, (int)(fightDuration - end), ParseEnum.Activation.None), log); } } else { start = c.Time - log.FightData.FightStart; phases.Add(new PhaseData(end, start)); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } string[] namesSab = new [] { "Phase 1", "Kernan", "Phase 2", "Knuckles", "Phase 3", "Karde", "Phase 4" }; for (int i = 1; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesSab[i - 1]; phase.DrawArea = i % 2 == 1; phase.DrawStart = i % 2 == 1 && i > 1; phase.DrawEnd = i % 2 == 1 && i < 7; phase.Targets.Add(mainTarget); if (i == 2 || i == 4 || i == 6) { List <ushort> ids = new List <ushort> { (ushort)Kernan, (ushort)Knuckles, (ushort)Karde, }; AddTargetsToPhase(phase, ids, log); } else { phase.Targets.Add(mainTarget); Boss addTarget; switch (i) { case 3: addTarget = Targets.Find(x => x.ID == (ushort)Kernan); if (addTarget == null) { throw new InvalidOperationException("Kernan not found when we should have been able to"); } phase.Targets.Add(addTarget); break; case 5: addTarget = Targets.Find(x => x.ID == (ushort)Knuckles); if (addTarget == null) { throw new InvalidOperationException("Knuckles not found when we should have been able to"); } phase.Targets.Add(addTarget); break; case 7: addTarget = Targets.Find(x => x.ID == (ushort)Karde); if (addTarget == null) { throw new InvalidOperationException("Karde not found when we should have been able to"); } phase.Targets.Add(addTarget); break; } } } return(phases); }
public LogStartEvent(CombatItem evtcItem) : base(evtcItem) { }
public EffectTeleport(EffectTeleportData data, CombatItem item) : base(data, item) { this.data = data; }
internal AbstractBuffEvent(CombatItem evtcItem, SkillData skillData) : base(evtcItem.Time) { BuffSkill = skillData.Get(evtcItem.SkillID); }
internal BuffExtensionEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData) { _oldValue = evtcItem.OverstackValue - evtcItem.Value; _durationChange = evtcItem.Value; }
public static List <AnimatedCastEvent> CreateCastEvents(Dictionary <ulong, List <CombatItem> > castEventsBySrcAgent, AgentData agentData, SkillData skillData, FightData fightData) { var res = new List <AnimatedCastEvent>(); foreach (KeyValuePair <ulong, List <CombatItem> > pairBySrcAgent in castEventsBySrcAgent) { var resBySrcAgent = new List <AnimatedCastEvent>(); var castEventsBySrcAgentBySkillID = pairBySrcAgent.Value.GroupBy(x => x.SkillID).ToDictionary(x => x.Key, x => x.ToList()); foreach (KeyValuePair <uint, List <CombatItem> > pairBySrcAgentBySkillID in castEventsBySrcAgentBySkillID) { var resBySrcAgentBySkillID = new List <AnimatedCastEvent>(); CombatItem startItem = null; foreach (CombatItem c in pairBySrcAgentBySkillID.Value) { if (c.StartCasting()) { // missing end if (startItem != null) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, fightData.LogEnd)); } startItem = c; } else if (c.EndCasting()) { if (startItem != null && startItem.SkillID == c.SkillID) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, c)); startItem = null; } // missing start else { var toCheck = new AnimatedCastEvent(agentData, skillData, c); // we are only interested in animations started before log starts if (toCheck.Time < fightData.LogStart) { resBySrcAgentBySkillID.Add(toCheck); } } } } // missing end if (startItem != null) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, fightData.LogEnd)); } resBySrcAgentBySkillID.RemoveAll(x => x.Caster.IsPlayer && x.ActualDuration <= 1); resBySrcAgent.AddRange(resBySrcAgentBySkillID); } resBySrcAgent = resBySrcAgent.OrderBy(x => x.Time).ToList(); // sanitize for (int i = 0; i < resBySrcAgent.Count - 1; i++) { resBySrcAgent[i].CutAt(resBySrcAgent[i + 1].Time + ParserHelper.ServerDelayConstant); } res.AddRange(resBySrcAgent); } res = res.OrderBy(x => x.Time).ToList(); return(res); }
internal BuffRemoveAllEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData) { _lastRemovedDuration = evtcItem.BuffDmg; RemovedStacks = evtcItem.Result; }
public VelocityEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem, agentData) { }
internal SkillTiming(CombatItem evtcItem) { ActionAction = (byte)evtcItem.SrcAgent; Action = ArcDPSEnums.GetSkillAction(ActionAction); AtMillisecond = evtcItem.DstAgent; }
public BuildEvent(CombatItem evtcItem) : base(evtcItem) { Build = evtcItem.SrcAgent; }
// Constructor public DamageLogCondition(long time, CombatItem c) : base(time, c) { damage = c.getBuffDmg(); }
public BuffRemoveManualEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData, long offset) : base(evtcItem, agentData, skillData, offset) { }
public EffectTransform(EffectTransformData data, CombatItem item) : base(data, item) { this.data = data; }
public EnterCombatEvent(CombatItem evtcItem, AgentData agentData, long offset) : base(evtcItem, agentData, offset) { }
protected AbilEffect(AbilEffectData data, CombatItem item) { this.data = data; this.item = item; }