internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { IReadOnlyList <AbstractCastEvent> cls = target.GetCastEvents(log, 0, log.FightData.FightEnd); switch (target.ID) { case (int)ArcDPSEnums.TargetID.Xera: var summon = cls.Where(x => x.SkillId == 34887).ToList(); foreach (AbstractCastEvent c in summon) { replay.Decorations.Add(new CircleDecoration(true, 0, 180, ((int)c.Time, (int)c.EndTime), "rgba(0, 180, 255, 0.3)", new AgentConnector(target))); } break; case (int)ArcDPSEnums.TrashID.ChargedBloodstone: if (_xeraFirstPhaseEndTime != 0) { replay.Trim(_xeraFirstPhaseEndTime + 12000, replay.TimeOffsets.end); } break; case (int)ArcDPSEnums.TrashID.BloodstoneFragment: replay.Decorations.Add(new CircleDecoration(true, 0, 760, ((int)replay.TimeOffsets.start, (int)replay.TimeOffsets.end), "rgba(255, 155, 0, 0.2)", new AgentConnector(target))); break; default: break; } }
internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { switch (target.ID) { case (int)ArcDPSEnums.TrashID.HollowedBomber: Point3D firstBomberMovement = replay.Velocities.FirstOrDefault(x => x.Length() != 0); if (firstBomberMovement != null) { replay.Trim(firstBomberMovement.Time - 1000, replay.TimeOffsets.end); } var bomberman = target.GetCastEvents(log, 0, log.FightData.FightEnd).Where(x => x.SkillId == 48272).ToList(); foreach (AbstractCastEvent bomb in bomberman) { int startCast = (int)bomb.Time; int endCast = (int)bomb.EndTime; int expectedEnd = Math.Max(startCast + bomb.ExpectedDuration, endCast); replay.Decorations.Add(new CircleDecoration(true, 0, 480, (startCast, endCast), "rgba(180,250,0,0.3)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, expectedEnd, 480, (startCast, endCast), "rgba(180,250,0,0.3)", new AgentConnector(target))); } break; case (int)ArcDPSEnums.TrashID.RiverOfSouls: Point3D firstRiverMovement = replay.Velocities.FirstOrDefault(x => x.Length() != 0); if (firstRiverMovement != null) { replay.Trim(firstRiverMovement.Time - 1000, replay.TimeOffsets.end); } if (replay.Rotations.Count > 0) { int start = (int)replay.TimeOffsets.start; int end = (int)replay.TimeOffsets.end; replay.Decorations.Add(new FacingRectangleDecoration((start, end), new AgentConnector(target), replay.PolledRotations, 160, 390, "rgba(255,100,0,0.5)")); } break; case (int)ArcDPSEnums.TrashID.Enervator: // TODO Line actor between desmina and enervator. Missing skillID case (int)ArcDPSEnums.TrashID.SpiritHorde1: case (int)ArcDPSEnums.TrashID.SpiritHorde2: case (int)ArcDPSEnums.TrashID.SpiritHorde3: break; default: break; } }
internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { switch (target.ID) { case (int)ArcDPSEnums.TargetID.MaiTrinStrike: HealthUpdateEvent lastHPUpdate = log.CombatData.GetHealthUpdateEvents(target.AgentItem).LastOrDefault(); long maiTrinEnd = lastHPUpdate.Time; replay.Trim(replay.TimeOffsets.start, maiTrinEnd); break; default: break; } }
internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { // TODO: correct position IReadOnlyList <AbstractCastEvent> cls = target.GetCastEvents(log, 0, log.FightData.FightEnd); int start = (int)replay.TimeOffsets.start; int end = (int)replay.TimeOffsets.end; switch (target.ID) { case (int)ArcDPSEnums.TargetID.Dhuum: var deathmark = cls.Where(x => x.SkillId == 48176).ToList(); AbstractCastEvent majorSplit = cls.FirstOrDefault(x => x.SkillId == 47396); foreach (AbstractCastEvent c in deathmark) { start = (int)c.Time; int zoneActive = start + 1550; int zoneDeadly = zoneActive + 6000; //point where the zone becomes impossible to walk through unscathed int zoneEnd = zoneActive + 120000; int radius = 450; if (majorSplit != null) { zoneEnd = Math.Min(zoneEnd, (int)majorSplit.Time); zoneDeadly = Math.Min(zoneDeadly, (int)majorSplit.Time); } int spellCenterDistance = 200; //hitbox radius Point3D facing = replay.Rotations.LastOrDefault(x => x.Time <= start + 3000); Point3D targetPosition = replay.PolledPositions.LastOrDefault(x => x.Time <= start + 3000); if (facing != null && targetPosition != null) { var position = new Point3D(targetPosition.X + (facing.X * spellCenterDistance), targetPosition.Y + (facing.Y * spellCenterDistance), targetPosition.Z); replay.Decorations.Add(new CircleDecoration(true, zoneActive, radius, (start, zoneActive), "rgba(200, 255, 100, 0.5)", new PositionConnector(position))); replay.Decorations.Add(new CircleDecoration(false, 0, radius, (start, zoneActive), "rgba(200, 255, 100, 0.5)", new PositionConnector(position))); replay.Decorations.Add(new CircleDecoration(true, 0, radius, (zoneActive, zoneDeadly), "rgba(200, 255, 100, 0.5)", new PositionConnector(position))); replay.Decorations.Add(new CircleDecoration(true, 0, radius, (zoneDeadly, zoneEnd), "rgba(255, 100, 0, 0.5)", new PositionConnector(position))); } } var cataCycle = cls.Where(x => x.SkillId == 48398).ToList(); foreach (AbstractCastEvent c in cataCycle) { start = (int)c.Time; end = (int)c.EndTime; replay.Decorations.Add(new CircleDecoration(true, end, 300, (start, end), "rgba(255, 150, 0, 0.7)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, 0, 300, (start, end), "rgba(255, 150, 0, 0.5)", new AgentConnector(target))); } var slash = cls.Where(x => x.SkillId == 47561).ToList(); foreach (AbstractCastEvent c in slash) { start = (int)c.Time; end = (int)c.EndTime; Point3D facing = replay.Rotations.FirstOrDefault(x => x.Time >= start); if (facing == null) { continue; } replay.Decorations.Add(new PieDecoration(false, 0, 850, facing, 60, (start, end), "rgba(255, 150, 0, 0.5)", new AgentConnector(target))); } if (majorSplit != null) { start = (int)majorSplit.Time; end = (int)log.FightData.FightEnd; replay.Decorations.Add(new CircleDecoration(true, 0, 320, (start, end), "rgba(0, 180, 255, 0.2)", new AgentConnector(target))); } break; case (int)ArcDPSEnums.TrashID.DhuumDesmina: break; case (int)ArcDPSEnums.TrashID.Echo: replay.Decorations.Add(new CircleDecoration(true, 0, 120, (start, end), "rgba(255, 0, 0, 0.5)", new AgentConnector(target))); break; case (int)ArcDPSEnums.TrashID.Enforcer: break; case (int)ArcDPSEnums.TrashID.Messenger: replay.Decorations.Add(new CircleDecoration(true, 0, 180, (start, end), "rgba(255, 125, 0, 0.5)", new AgentConnector(target))); break; case (int)ArcDPSEnums.TrashID.Deathling: break; case (int)ArcDPSEnums.TrashID.UnderworldReaper: List <AbstractBuffEvent> stealths = GetFilteredList(log.CombatData, 13017, target, true, true); int stealthStart = 0; int stealthEnd = 0; foreach (AbstractBuffEvent c in stealths) { if (c is BuffApplyEvent) { stealthStart = (int)c.Time; } else { stealthEnd = (int)c.Time; replay.Decorations.Add(new CircleDecoration(true, 0, 180, (stealthStart, stealthEnd), "rgba(80, 80, 80, 0.3)", new AgentConnector(target))); } } if (!_isBugged) { if (_greenStart == 0) { AbstractBuffEvent greenTaken = log.CombatData.GetBuffData(46950).Where(x => x is BuffApplyEvent).FirstOrDefault(); if (greenTaken != null) { _greenStart = (int)greenTaken.Time - 5000; } else { _greenStart = 30600; } } Point3D pos = replay.Positions.FirstOrDefault(); if (replay.Positions.Count > 1) { replay.Trim(replay.Positions.LastOrDefault().Time, replay.TimeOffsets.end); } if (pos == null) { break; } int reaper = -1; foreach (KeyValuePair <Point3D, int> pair in ReapersToGreen) { if (pair.Key.DistanceToPoint(pos) < 10) { reaper = pair.Value; break; } } if (reaper == -1) { break; } int multiplier = 210000; int gStart = _greenStart + reaper * 30000; var greens = new List <int>() { gStart, gStart + multiplier, gStart + 2 * multiplier }; foreach (int gstart in greens) { int gend = gstart + 5000; replay.Decorations.Add(new CircleDecoration(true, 0, 240, (gstart, gend), "rgba(0, 255, 0, 0.2)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, gend, 240, (gstart, gend), "rgba(0, 255, 0, 0.2)", new AgentConnector(target))); } } break; default: break; } }