Пример #1
0
        public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData)
        {
            AgentItem target = agentData.GetAgentsByID(TriggerID).FirstOrDefault();

            foreach (CombatItem c in combatData)
            {
                // redirect all attacks to the main golem
                if (c.DstAgent == 0 && c.DstInstid == 0 && c.IsStateChange == ParseEnum.StateChange.None && c.IFF == ParseEnum.IFF.Foe && c.IsActivation == ParseEnum.Activation.None && c.IsBuffRemove == ParseEnum.BuffRemove.None)
                {
                    c.OverrideDstValues(target.Agent, target.InstID);
                }
            }
            CombatItem pov = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.PointOfView);

            if (pov != null)
            {
                // to make sure that the logging starts when the PoV starts attacking (in case there is a slave with them)
                CombatItem enterCombat = combatData.FirstOrDefault(x => x.SrcAgent == pov.SrcAgent && x.IsStateChange == ParseEnum.StateChange.EnterCombat);
                if (enterCombat != null)
                {
                    fightData.OverrideStart(enterCombat.LogTime);
                }
            }
            ComputeFightTargets(agentData, combatData);
        }
Пример #2
0
        protected void ComputeFightTargets(AgentData agentData, List <CombatItem> combatItems)
        {
            foreach (ushort id in GetUniqueTargetIDs())
            {
                RegroupTargetsByID(id, agentData, combatItems);
            }
            List <ushort> ids = GetFightTargetsIDs();

            foreach (ushort id in ids)
            {
                List <AgentItem> agents = agentData.GetAgentsByID(id);
                foreach (AgentItem agentItem in agents)
                {
                    Targets.Add(new Target(agentItem));
                }
            }
            List <ParseEnum.TrashIDS> ids2  = GetTrashMobsIDS();
            List <AgentItem>          aList = agentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids2.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList();

            foreach (AgentItem a in aList)
            {
                Mob mob = new Mob(a);
                TrashMobs.Add(mob);
            }
        }
Пример #3
0
        private void RegroupTargetsByID(ushort id, AgentData agentData, List <CombatItem> combatItems)
        {
            List <AgentItem> agents = agentData.GetAgentsByID(id);

            if (agents.Count > 1)
            {
                AgentItem       firstItem      = agents.First();
                HashSet <ulong> agentValues    = new HashSet <ulong>(agents.Select(x => x.Agent));
                AgentItem       newTargetAgent = new AgentItem(firstItem)
                {
                    FirstAwareLogTime = agents.Min(x => x.FirstAwareLogTime),
                    LastAwareLogTime  = agents.Max(x => x.LastAwareLogTime)
                };
                // get unique id for the fusion
                ushort instID = 0;
                Random rnd    = new Random();
                while (agentData.InstIDValues.Contains(instID) || instID == 0)
                {
                    instID = (ushort)rnd.Next(ushort.MaxValue / 2, ushort.MaxValue);
                }
                newTargetAgent.InstID = instID;
                agentData.OverrideID(id, newTargetAgent);
                foreach (CombatItem c in combatItems)
                {
                    if (agentValues.Contains(c.SrcAgent))
                    {
                        c.OverrideSrcValues(newTargetAgent.Agent, newTargetAgent.InstID);
                    }
                    if (agentValues.Contains(c.DstAgent))
                    {
                        c.OverrideDstValues(newTargetAgent.Agent, newTargetAgent.InstID);
                    }
                }
            }
        }
Пример #4
0
        public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData)
        {
            // The walls spawn at the start of the encounter, we fix it by overriding their first aware to the first velocity change event
            List <AgentItem> riverOfSouls   = agentData.GetAgentsByID((ushort)RiverOfSouls);
            bool             sortCombatList = false;

            foreach (AgentItem riverOfSoul in riverOfSouls)
            {
                CombatItem firstMovement = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.Velocity && x.SrcInstid == riverOfSoul.InstID && x.LogTime <= riverOfSoul.LastAwareLogTime);
                if (firstMovement != null)
                {
                    // update start
                    riverOfSoul.FirstAwareLogTime = firstMovement.LogTime - 10;
                    foreach (CombatItem c in combatData)
                    {
                        if (c.SrcInstid == riverOfSoul.InstID && c.LogTime < riverOfSoul.FirstAwareLogTime && (c.IsStateChange == ParseEnum.StateChange.Position || c.IsStateChange == ParseEnum.StateChange.Rotation))
                        {
                            sortCombatList = true;
                            c.OverrideTime(riverOfSoul.FirstAwareLogTime);
                        }
                    }
                }
                else
                {
                    // otherwise remove the agent from the pool
                    agentData.RemoveAgent(riverOfSoul);
                }
            }
            // make sure the list is still sorted by time after overrides
            if (sortCombatList)
            {
                combatData.Sort((x, y) => x.LogTime.CompareTo(y.LogTime));
            }
            ComputeFightTargets(agentData, combatData);
        }
        public void ComputeFightTargets(AgentData agentData, FightData fightData, List <CombatItem> combatItems)
        {
            List <ushort> ids = GetFightTargetsIDs();

            foreach (ushort id in ids)
            {
                List <AgentItem> agents = agentData.GetAgentsByID(id);
                foreach (AgentItem agentItem in agents)
                {
                    Targets.Add(new Boss(agentItem));
                }
            }
            RegroupTargets(agentData, combatItems);
        }
Пример #6
0
 public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success)
     {
         List <AgentItem> prisoners      = agentData.GetAgentsByID((ushort)Prisoner2);
         List <DeadEvent> prisonerDeaths = new List <DeadEvent>();
         foreach (AgentItem prisoner in prisoners)
         {
             prisonerDeaths.AddRange(combatData.GetDeadEvents(prisoner));
         }
         if (prisonerDeaths.Count == 0)
         {
             SetSuccessByCombatExit(new HashSet <ushort>(GetSuccessCheckIds()), combatData, fightData, playerAgents);
         }
     }
 }
Пример #7
0
        public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData)
        {
            // Find target
            AgentItem target = agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.Ensolyss).FirstOrDefault();

            if (target == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            // enter combat
            CombatItem invulLost = combatData.FirstOrDefault(x => x.DstInstid == target.InstID && x.IsStateChange == ParseEnum.StateChange.None && x.IsBuffRemove != ParseEnum.BuffRemove.None && x.SkillID == 762);

            if (invulLost != null && invulLost.LogTime - fightData.FightStartLogTime < 5000)
            {
                fightData.OverrideStart(invulLost.LogTime);
            }
            ComputeFightTargets(agentData, combatData);
        }
Пример #8
0
 public override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents)
 {
     base.CheckSuccess(combatData, agentData, fightData, playerAgents);
     if (!fightData.Success)
     {
         Target target = Targets.Find(x => x.ID == TriggerID);
         if (target == null)
         {
             throw new InvalidOperationException("Target for success by combat exit not found");
         }
         AgentItem zommoros = agentData.GetAgentsByID(21118).LastOrDefault();
         if (zommoros == null)
         {
             return;
         }
         SpawnEvent          npcSpawn        = combatData.GetSpawnEvents(zommoros).LastOrDefault();
         AbstractDamageEvent lastDamageTaken = combatData.GetDamageTakenData(target.AgentItem).LastOrDefault(x => (x.Damage > 0) && (playerAgents.Contains(x.From) || playerAgents.Contains(x.MasterFrom)));
         if (npcSpawn != null && lastDamageTaken != null)
         {
             fightData.SetSuccess(true, fightData.ToLogSpace(lastDamageTaken.Time));
         }
     }
 }
        protected void RegroupTargetsByID(ushort id, AgentData agentData, List <CombatItem> combatItems)
        {
            List <AgentItem> agents    = agentData.GetAgentsByID(id);
            List <Boss>      toRegroup = Targets.Where(x => x.ID == id).ToList();

            if (agents.Count > 0 && toRegroup.Count > 0)
            {
                Targets.RemoveAll(x => x.ID == id);
                AgentItem firstItem = agents.First();
                agents = agents.Where(x => x.InstID == firstItem.InstID).ToList();
                HashSet <ulong> agentValues = new HashSet <ulong>(agents.Select(x => x.Agent));
                agentValues.Remove(firstItem.Agent);
                AgentItem newTargetAgent = new AgentItem(firstItem)
                {
                    FirstAware = agents.Min(x => x.FirstAware),
                    LastAware  = agents.Max(x => x.LastAware)
                };
                agentData.OverrideID(id, firstItem.InstID, newTargetAgent);
                Targets.Add(new Boss(newTargetAgent));
                if (agentValues.Count == 0)
                {
                    return;
                }
                foreach (CombatItem c in combatItems)
                {
                    if (agentValues.Contains(c.SrcAgent))
                    {
                        c.SrcAgent = newTargetAgent.Agent;
                    }
                    if (agentValues.Contains(c.DstAgent))
                    {
                        c.DstAgent = newTargetAgent.Agent;
                    }
                }
            }
        }
Пример #10
0
        public override void SpecialParse(FightData fightData, AgentData agentData, List <CombatItem> combatData)
        {
            // find target
            AgentItem target = agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.Xera).FirstOrDefault();

            if (target == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            // enter combat
            CombatItem enterCombat = combatData.Find(x => x.SrcInstid == target.InstID && x.IsStateChange == ParseEnum.StateChange.EnterCombat);

            if (enterCombat != null)
            {
                fightData.OverrideStart(enterCombat.LogTime);
            }
            // find split
            foreach (AgentItem NPC in agentData.GetAgentByType(AgentItem.AgentType.NPC))
            {
                if (NPC.ID == 16286)
                {
                    CombatItem move = combatData.FirstOrDefault(x => x.IsStateChange == ParseEnum.StateChange.Position && x.SrcInstid == NPC.InstID && x.LogTime >= NPC.FirstAwareLogTime + 500 && x.LogTime <= NPC.LastAwareLogTime);
                    if (move != null)
                    {
                        _specialSplitLogTime = move.LogTime;
                    }
                    else
                    {
                        _specialSplitLogTime = NPC.FirstAwareLogTime;
                    }
                    target.LastAwareLogTime = NPC.LastAwareLogTime;
                    // get unique id for the fusion
                    ushort instID = 0;
                    Random rnd    = new Random();
                    while (agentData.InstIDValues.Contains(instID) || instID == 0)
                    {
                        instID = (ushort)rnd.Next(ushort.MaxValue / 2, ushort.MaxValue);
                    }
                    target.InstID = instID;
                    agentData.Refresh();
                    HashSet <ulong> agents = new HashSet <ulong>()
                    {
                        NPC.Agent, target.Agent
                    };
                    // update combat data
                    foreach (CombatItem c in combatData)
                    {
                        if (agents.Contains(c.SrcAgent))
                        {
                            c.OverrideSrcValues(target.Agent, target.InstID);
                        }
                        if (agents.Contains(c.DstAgent))
                        {
                            c.OverrideDstValues(target.Agent, target.InstID);
                        }
                    }
                    break;
                }
            }
            ComputeFightTargets(agentData, combatData);
        }