コード例 #1
0
 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);
         }
     }
 }
コード例 #2
0
 internal BuffRemoveManualEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData)
 {
 }
コード例 #3
0
 internal AttackTargetEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem, agentData)
 {
     AttackTarget = Src;
     Src          = agentData.GetAgent(evtcItem.DstAgent, evtcItem.Time);
 }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
 internal PointOfViewEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem)
 {
     PoV = agentData.GetAgent(evtcItem.SrcAgent, evtcItem.Time);
 }
コード例 #7
0
        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;
            }
        }
コード例 #8
0
ファイル: Intent.cs プロジェクト: SkankinGarbage/mgne
 public void SetItem(CombatItem itemToUse)
 {
     Item = itemToUse;
     Targets.Clear();
 }
コード例 #9
0
 public AbstractMovementEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem.Time)
 {
     AgentItem = agentData.GetAgent(evtcItem.SrcAgent);
     _dstAgent = evtcItem.DstAgent;
     _value    = evtcItem.Value;
 }
コード例 #10
0
        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));
                     * }*/
                }
            }
        }
コード例 #11
0
 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);
 }
コード例 #13
0
 public EffectUseRestore(EffectUseRestoreData data, CombatItem item) : base(data, item)
 {
     this.data = data;
 }
コード例 #14
0
 public HealthUpdateEvent(CombatItem evtcItem, AgentData agentData, long offset) : base(evtcItem, agentData, offset)
 {
     HPPercent = evtcItem.DstAgent / 100.0;
 }
コード例 #15
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)));
                    }
                }
            }
        }
コード例 #16
0
        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);
        }
コード例 #17
0
 public LogStartEvent(CombatItem evtcItem) : base(evtcItem)
 {
 }
コード例 #18
0
 public EffectTeleport(EffectTeleportData data, CombatItem item) : base(data, item)
 {
     this.data = data;
 }
コード例 #19
0
 internal AbstractBuffEvent(CombatItem evtcItem, SkillData skillData) : base(evtcItem.Time)
 {
     BuffSkill = skillData.Get(evtcItem.SkillID);
 }
コード例 #20
0
 internal BuffExtensionEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData)
 {
     _oldValue       = evtcItem.OverstackValue - evtcItem.Value;
     _durationChange = evtcItem.Value;
 }
コード例 #21
0
        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);
        }
コード例 #22
0
 internal BuffRemoveAllEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData)
 {
     _lastRemovedDuration = evtcItem.BuffDmg;
     RemovedStacks        = evtcItem.Result;
 }
コード例 #23
0
 public VelocityEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem, agentData)
 {
 }
コード例 #24
0
 internal SkillTiming(CombatItem evtcItem)
 {
     ActionAction  = (byte)evtcItem.SrcAgent;
     Action        = ArcDPSEnums.GetSkillAction(ActionAction);
     AtMillisecond = evtcItem.DstAgent;
 }
コード例 #25
0
 public BuildEvent(CombatItem evtcItem) : base(evtcItem)
 {
     Build = evtcItem.SrcAgent;
 }
コード例 #26
0
 // Constructor
 public DamageLogCondition(long time, CombatItem c) : base(time, c)
 {
     damage = c.getBuffDmg();
 }
コード例 #27
0
 public BuffRemoveManualEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData, long offset) : base(evtcItem, agentData, skillData, offset)
 {
 }
コード例 #28
0
 public EffectTransform(EffectTransformData data, CombatItem item) : base(data, item)
 {
     this.data = data;
 }
コード例 #29
0
        public EnterCombatEvent(CombatItem evtcItem, AgentData agentData, long offset) : base(evtcItem, agentData, offset)
        {

        }
コード例 #30
0
ファイル: AbilEffect.cs プロジェクト: SkankinGarbage/mgne
 protected AbilEffect(AbilEffectData data, CombatItem item)
 {
     this.data = data;
     this.item = item;
 }