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.BrokenKing: var Cone = cls.Where(x => x.SkillId == 48066).ToList(); foreach (AbstractCastEvent c in Cone) { int start = (int)c.Time; int end = (int)c.EndTime; int range = 450; int angle = 100; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time <= start + 1000); if (facing == null) { continue; } replay.Decorations.Add(new PieDecoration(true, 0, range, facing, angle, (start, end), "rgba(0,100,255,0.2)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, range, facing, angle, (start + 1900, end), "rgba(0,100,255,0.3)", new AgentConnector(target))); } break; default: break; } }
public override void ComputeNPCCombatReplayActors(NPC target, ParsedLog log, CombatReplay replay) { List <AbstractCastEvent> cls = target.GetCastLogs(log, 0, log.FightData.FightEnd); switch (target.ID) { case (int)ParseEnum.TargetIDS.Slothasor: var sleepy = cls.Where(x => x.SkillId == 34515).ToList(); foreach (AbstractCastEvent c in sleepy) { replay.Decorations.Add(new CircleDecoration(true, 0, 180, ((int)c.Time, (int)c.Time + c.ActualDuration), "rgba(0, 180, 255, 0.3)", new AgentConnector(target))); } var breath = cls.Where(x => x.SkillId == 34516).ToList(); foreach (AbstractCastEvent c in breath) { int start = (int)c.Time; int preCastTime = 1000; int duration = 2000; int range = 600; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time <= start + 1000); if (facing != null) { int direction = Point3D.GetRotationFromFacing(facing); int angle = 60; replay.Decorations.Add(new PieDecoration(true, 0, range, direction, angle, (start, start + preCastTime), "rgba(255,200,0,0.1)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, range, direction, angle, (start + preCastTime, start + preCastTime + duration), "rgba(255,200,0,0.4)", new AgentConnector(target))); } } var tantrum = cls.Where(x => x.SkillId == 34547).ToList(); foreach (AbstractCastEvent c in tantrum) { int start = (int)c.Time; int end = start + c.ActualDuration; replay.Decorations.Add(new CircleDecoration(false, 0, 300, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, end, 300, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(target))); } var shakes = cls.Where(x => x.SkillId == 34482).ToList(); foreach (AbstractCastEvent c in shakes) { int start = (int)c.Time; int end = start + c.ActualDuration; replay.Decorations.Add(new CircleDecoration(false, 0, 700, (start, end), "rgba(255, 0, 0, 0.4)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, end, 700, (start, end), "rgba(255, 0, 0, 0.4)", new AgentConnector(target))); } break; default: break; } }
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.Slothasor: var sleepy = cls.Where(x => x.SkillId == NarcolepsySkill).ToList(); foreach (AbstractCastEvent c in sleepy) { replay.Decorations.Add(new CircleDecoration(true, 0, 180, ((int)c.Time, (int)c.EndTime), "rgba(0, 180, 255, 0.3)", new AgentConnector(target))); } var breath = cls.Where(x => x.SkillId == Halitosis).ToList(); foreach (AbstractCastEvent c in breath) { int start = (int)c.Time; int preCastTime = 1000; int duration = 2000; int range = 600; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time <= start + 1000); if (facing != null) { float direction = Point3D.GetRotationFromFacing(facing); int angle = 60; replay.Decorations.Add(new PieDecoration(true, 0, range, direction, angle, (start, start + preCastTime), "rgba(255,200,0,0.1)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, range, direction, angle, (start + preCastTime, start + preCastTime + duration), "rgba(255,200,0,0.4)", new AgentConnector(target))); } } var tantrum = cls.Where(x => x.SkillId == TantrumSkill).ToList(); foreach (AbstractCastEvent c in tantrum) { int start = (int)c.Time; int end = (int)c.EndTime; replay.Decorations.Add(new CircleDecoration(false, 0, 300, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, end, 300, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(target))); } var shakes = cls.Where(x => x.SkillId == SporeRelease).ToList(); foreach (AbstractCastEvent c in shakes) { int start = (int)c.Time; int end = (int)c.EndTime; replay.Decorations.Add(new CircleDecoration(false, 0, 700, (start, end), "rgba(255, 0, 0, 0.4)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, end, 700, (start, end), "rgba(255, 0, 0, 0.4)", new AgentConnector(target))); } break; default: break; } }
internal PieDecorationCombatReplayDescription(ParsedEvtcLog log, PieDecoration decoration, CombatReplayMap map) : base(log, decoration, map) { Type = "Pie"; Direction = decoration.Direction; OpeningAngle = decoration.OpeningAngle; }
internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { 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.KeepConstruct: List <AbstractBuffEvent> kcOrbCollect = GetFilteredList(log.CombatData, XerasBoon, target, true, true); int kcOrbStart = 0, kcOrbEnd = 0; foreach (AbstractBuffEvent c in kcOrbCollect) { if (c is BuffApplyEvent) { kcOrbStart = (int)c.Time; } else { kcOrbEnd = (int)c.Time; replay.Decorations.Add(new CircleDecoration(false, 0, 300, (kcOrbStart, kcOrbEnd), "rgba(255, 0, 0, 0.5)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, kcOrbEnd, 300, (kcOrbStart, kcOrbEnd), "rgba(255, 0, 0, 0.5)", new AgentConnector(target))); } } var towerDrop = cls.Where(x => x.SkillId == TowerDrop).ToList(); foreach (AbstractCastEvent c in towerDrop) { start = (int)c.Time; end = (int)c.EndTime; int skillCast = end - 1000; Point3D next = replay.PolledPositions.FirstOrDefault(x => x.Time >= end); Point3D prev = replay.PolledPositions.LastOrDefault(x => x.Time <= end); if (prev != null || next != null) { replay.Decorations.Add(new CircleDecoration(false, 0, 400, (start, skillCast), "rgba(255, 150, 0, 0.5)", new InterpolatedPositionConnector(prev, next, end))); replay.Decorations.Add(new CircleDecoration(true, skillCast, 400, (start, skillCast), "rgba(255, 150, 0, 0.5)", new InterpolatedPositionConnector(prev, next, end))); } } var blades1 = cls.Where(x => x.SkillId == PhantasmalBlades1).ToList(); var blades2 = cls.Where(x => x.SkillId == PhantasmalBlades2).ToList(); var blades3 = cls.Where(x => x.SkillId == PhantasmalBlades3).ToList(); int bladeDelay = 150; int duration = 1000; foreach (AbstractCastEvent c in blades1) { int ticks = (int)Math.Max(0, Math.Min(Math.Ceiling((c.ActualDuration - 1150) / 1000.0), 9)); start = (int)c.Time + bladeDelay; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time < start + 1000); if (facing == null) { continue; } replay.Decorations.Add(new CircleDecoration(true, 0, 200, (start, start + (ticks + 1) * 1000), "rgba(255,0,0,0.4)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, 1600, facing, 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long for (int i = 1; i < ticks; i++) { replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(facing.Y, facing.X)) + i * 360 / 8), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer } } foreach (AbstractCastEvent c in blades2) { int ticks = (int)Math.Max(0, Math.Min(Math.Ceiling((c.ActualDuration - 1150) / 1000.0), 9)); start = (int)c.Time + bladeDelay; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time < start + 1000); if (facing == null) { continue; } replay.Decorations.Add(new CircleDecoration(true, 0, 200, (start, start + (ticks + 1) * 1000), "rgba(255,0,0,0.4)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, 1600, facing, 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X))), 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long for (int i = 1; i < ticks; i++) { replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(facing.Y, facing.X)) + i * 360 / 8), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) + i * 360 / 8), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer } } foreach (AbstractCastEvent c in blades3) { int ticks = (int)Math.Max(0, Math.Min(Math.Ceiling((c.ActualDuration - 1150) / 1000.0), 9)); start = (int)c.Time + bladeDelay; Point3D facing = replay.Rotations.LastOrDefault(x => x.Time < start + 1000); if (facing == null) { continue; } replay.Decorations.Add(new CircleDecoration(true, 0, 200, (start, start + (ticks + 1) * 1000), "rgba(255,0,0,0.4)", new AgentConnector(target))); replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X))), 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) + 120), 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) - 120), 360 * 3 / 32, (start, start + 2 * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts twice as long for (int i = 1; i < ticks; i++) { replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) + i * 360 / 8), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) + i * 360 / 8 + 120), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer replay.Decorations.Add(new PieDecoration(true, 0, 1600, (ParserHelper.RadianToDegreeF(Math.Atan2(-facing.Y, -facing.X)) + i * 360 / 8 - 120), 360 * 3 / 32, (start + 1000 + i * duration, start + 1000 + (i + 1) * duration), "rgba(255,0,255,0.5)", new AgentConnector(target))); // First blade lasts longer } } break; case (int)ArcDPSEnums.TrashID.KeepConstructCore: break; case (int)ArcDPSEnums.TrashID.Jessica: case (int)ArcDPSEnums.TrashID.Olson: case (int)ArcDPSEnums.TrashID.Engul: case (int)ArcDPSEnums.TrashID.Faerla: case (int)ArcDPSEnums.TrashID.Caulle: case (int)ArcDPSEnums.TrashID.Henley: case (int)ArcDPSEnums.TrashID.Galletta: case (int)ArcDPSEnums.TrashID.Ianim: replay.Decorations.Add(new CircleDecoration(false, 0, 600, (start, end), "rgba(255, 0, 0, 0.5)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, 0, 400, (start, end), "rgba(0, 125, 255, 0.5)", new AgentConnector(target))); Point3D firstPhantasmPosition = replay.PolledPositions.FirstOrDefault(); if (firstPhantasmPosition != null) { replay.Decorations.Add(new CircleDecoration(true, 0, 300, (start - 5000, start), "rgba(220, 50, 0, 0.5)", new PositionConnector(firstPhantasmPosition))); replay.Decorations.Add(new CircleDecoration(true, start, 300, (start - 5000, start), "rgba(220, 50, 0, 0.5)", new PositionConnector(firstPhantasmPosition))); } break; case (int)ArcDPSEnums.TrashID.GreenPhantasm: int lifetime = 8000; replay.Decorations.Add(new CircleDecoration(true, 0, 210, (start, start + lifetime), "rgba(0,255,0,0.2)", new AgentConnector(target))); replay.Decorations.Add(new CircleDecoration(true, start + lifetime, 210, (start, start + lifetime), "rgba(0,255,0,0.3)", new AgentConnector(target))); break; case (int)ArcDPSEnums.TrashID.RetrieverProjection: case (int)ArcDPSEnums.TrashID.InsidiousProjection: case (int)ArcDPSEnums.TrashID.UnstableLeyRift: case (int)ArcDPSEnums.TrashID.RadiantPhantasm: case (int)ArcDPSEnums.TrashID.CrimsonPhantasm: break; default: break; } }