Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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;
            }
        }