public static void CreateStateChangeEvents(List <CombatItem> stateChangeEvents, MetaEventsContainer metaDataEvents, StatusEventsContainer statusEvents, List <RewardEvent> rewardEvents, AgentData agentData)
        {
            foreach (CombatItem c in stateChangeEvents)
            {
                switch (c.IsStateChange)
                {
                case ParseEnum.StateChange.EnterCombat:
                    var enterCombatEvt = new EnterCombatEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.EnterCombatEvents, enterCombatEvt.Src, enterCombatEvt);
                    break;

                case ParseEnum.StateChange.ExitCombat:
                    var exitCombatEvt = new ExitCombatEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.ExitCombatEvents, exitCombatEvt.Src, exitCombatEvt);
                    break;

                case ParseEnum.StateChange.ChangeUp:
                    var aliveEvt = new AliveEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.AliveEvents, aliveEvt.Src, aliveEvt);
                    break;

                case ParseEnum.StateChange.ChangeDead:
                    var deadEvt = new DeadEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DeadEvents, deadEvt.Src, deadEvt);
                    break;

                case ParseEnum.StateChange.ChangeDown:
                    var downEvt = new DownEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DownEvents, downEvt.Src, downEvt);
                    break;

                case ParseEnum.StateChange.Spawn:
                    var spawnEvt = new SpawnEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.SpawnEvents, spawnEvt.Src, spawnEvt);
                    break;

                case ParseEnum.StateChange.Despawn:
                    var despawnEvt = new DespawnEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DespawnEvents, despawnEvt.Src, despawnEvt);
                    break;

                case ParseEnum.StateChange.HealthUpdate:
                    var healthEvt = new HealthUpdateEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.HealthUpdateEvents, healthEvt.Src, healthEvt);
                    break;

                case ParseEnum.StateChange.LogStart:
                    if (c.Value == 0 || c.BuffDmg == 0)
                    {
                        continue;
                    }
                    metaDataEvents.LogStartEvent = new LogStartEvent(c);
                    break;

                case ParseEnum.StateChange.LogEnd:
                    if (c.Value == 0 || c.BuffDmg == 0)
                    {
                        continue;
                    }
                    metaDataEvents.LogEndEvent = new LogEndEvent(c);
                    break;

                case ParseEnum.StateChange.MaxHealthUpdate:
                    var maxHealthEvt = new MaxHealthUpdateEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.MaxHealthUpdateEvents, maxHealthEvt.Src, maxHealthEvt);
                    break;

                case ParseEnum.StateChange.PointOfView:
                    if (c.SrcAgent == 0)
                    {
                        continue;
                    }
                    metaDataEvents.PointOfViewEvent = new PointOfViewEvent(c, agentData);
                    break;

                case ParseEnum.StateChange.Language:
                    metaDataEvents.LanguageEvent = new LanguageEvent(c);
                    break;

                case ParseEnum.StateChange.GWBuild:
                    if (c.SrcAgent == 0)
                    {
                        continue;
                    }
                    metaDataEvents.BuildEvent = new BuildEvent(c);
                    break;

                case ParseEnum.StateChange.ShardId:
                    metaDataEvents.ShardEvents.Add(new ShardEvent(c));
                    break;

                case ParseEnum.StateChange.Reward:
                    rewardEvents.Add(new RewardEvent(c));
                    break;

                case ParseEnum.StateChange.TeamChange:
                    var tcEvt = new TeamChangeEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.TeamChangeEvents, tcEvt.Src, tcEvt);
                    break;

                case ParseEnum.StateChange.AttackTarget:
                    var aTEvt = new AttackTargetEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.AttackTargetEvents, aTEvt.Src, aTEvt);
                    break;

                case ParseEnum.StateChange.Targetable:
                    var tarEvt = new TargetableEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.TargetableEvents, tarEvt.Src, tarEvt);
                    break;

                case ParseEnum.StateChange.MapID:
                    metaDataEvents.MapIDEvents.Add(new MapIDEvent(c));
                    break;

                case ParseEnum.StateChange.Guild:
                    var gEvt = new GuildEvent(c, agentData);
                    GeneralHelper.Add(metaDataEvents.GuildEvents, gEvt.Src, gEvt);
                    break;

                case ParseEnum.StateChange.BuffInfo:
                case ParseEnum.StateChange.BuffFormula:
                    if (metaDataEvents.BuffInfoEvents.TryGetValue(c.SkillID, out BuffInfoEvent buffInfoEvent))
                    {
                        buffInfoEvent.CompleteBuffInfoEvent(c);
                    }
                    else
                    {
                        buffInfoEvent = new BuffInfoEvent(c);
                        metaDataEvents.BuffInfoEvents[c.SkillID] = buffInfoEvent;
                    }
                    if (c.IsStateChange == ParseEnum.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 ParseEnum.StateChange.SkillInfo:
                case ParseEnum.StateChange.SkillTiming:
                    if (metaDataEvents.SkillInfoEvents.TryGetValue(c.SkillID, out SkillInfoEvent skillInfoEvent))
                    {
                        skillInfoEvent.CompleteSkillInfoEvent(c);
                    }
                    else
                    {
                        skillInfoEvent = new SkillInfoEvent(c);
                        metaDataEvents.SkillInfoEvents[c.SkillID] = skillInfoEvent;
                    }
                    break;

                case ParseEnum.StateChange.BreakbarState:
                    var bSEvt = new BreakbarStateEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.BreakbarStateEvents, bSEvt.Src, bSEvt);
                    break;

                case ParseEnum.StateChange.BreakbarPercent:
                    var bPEvt = new BreakbarPercentEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.BreakbarPercentEvents, bPEvt.Src, bPEvt);
                    break;

                case ParseEnum.StateChange.Error:
                    metaDataEvents.ErrorEvents.Add(new ErrorEvent(c));
                    break;

                case ParseEnum.StateChange.Tag:
                    // Getting ready in case this becomes an actual state event
                    _ = new TagEvent(c, agentData);
                    //GeneralHelper.Add(metaDataEvents.TagEvents, tagEvt.Src, tagEvt);
                    break;
                }
            }
        }
        public static void CreateStateChangeEvents(List <CombatItem> stateChangeEvents, MetaEventsContainer metaDataEvents, StatusEventsContainer statusEvents, List <RewardEvent> rewardEvents, AgentData agentData)
        {
            foreach (CombatItem c in stateChangeEvents)
            {
                switch (c.IsStateChange)
                {
                case ParseEnum.StateChange.EnterCombat:
                    var enterCombatEvt = new EnterCombatEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.EnterCombatEvents, enterCombatEvt.Src, enterCombatEvt);
                    break;

                case ParseEnum.StateChange.ExitCombat:
                    var exitCombatEvt = new ExitCombatEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.ExitCombatEvents, exitCombatEvt.Src, exitCombatEvt);
                    break;

                case ParseEnum.StateChange.ChangeUp:
                    var aliveEvt = new AliveEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.AliveEvents, aliveEvt.Src, aliveEvt);
                    break;

                case ParseEnum.StateChange.ChangeDead:
                    var deadEvt = new DeadEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DeadEvents, deadEvt.Src, deadEvt);
                    break;

                case ParseEnum.StateChange.ChangeDown:
                    var downEvt = new DownEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DownEvents, downEvt.Src, downEvt);
                    break;

                case ParseEnum.StateChange.Spawn:
                    var spawnEvt = new SpawnEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.SpawnEvents, spawnEvt.Src, spawnEvt);
                    break;

                case ParseEnum.StateChange.Despawn:
                    var despawnEvt = new DespawnEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.DespawnEvents, despawnEvt.Src, despawnEvt);
                    break;

                case ParseEnum.StateChange.HealthUpdate:
                    var healthEvt = new HealthUpdateEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.HealthUpdateEvents, healthEvt.Src, healthEvt);
                    break;

                case ParseEnum.StateChange.LogStart:
                    metaDataEvents.LogStartEvents.Add(new LogStartEvent(c));
                    break;

                case ParseEnum.StateChange.LogEnd:
                    metaDataEvents.LogEndEvents.Add(new LogEndEvent(c));
                    break;

                case ParseEnum.StateChange.MaxHealthUpdate:
                    var maxHealthEvt = new MaxHealthUpdateEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.MaxHealthUpdateEvents, maxHealthEvt.Src, maxHealthEvt);
                    break;

                case ParseEnum.StateChange.PointOfView:
                    metaDataEvents.PointOfViewEvents.Add(new PointOfViewEvent(c, agentData));
                    break;

                case ParseEnum.StateChange.Language:
                    metaDataEvents.LanguageEvents.Add(new LanguageEvent(c));
                    break;

                case ParseEnum.StateChange.GWBuild:
                    metaDataEvents.BuildEvents.Add(new BuildEvent(c));
                    break;

                case ParseEnum.StateChange.ShardId:
                    metaDataEvents.ShardEvents.Add(new ShardEvent(c));
                    break;

                case ParseEnum.StateChange.Reward:
                    rewardEvents.Add(new RewardEvent(c));
                    break;

                case ParseEnum.StateChange.TeamChange:
                    var tcEvt = new TeamChangeEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.TeamChangeEvents, tcEvt.Src, tcEvt);
                    break;

                case ParseEnum.StateChange.AttackTarget:
                    var aTEvt = new AttackTargetEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.AttackTargetEvents, aTEvt.Src, aTEvt);
                    break;

                case ParseEnum.StateChange.Targetable:
                    var tarEvt = new TargetableEvent(c, agentData);
                    GeneralHelper.Add(statusEvents.TargetableEvents, tarEvt.Src, tarEvt);
                    break;

                case ParseEnum.StateChange.MapID:
                    metaDataEvents.MapIDEvents.Add(new MapIDEvent(c));
                    break;

                case ParseEnum.StateChange.Guild:
                    var gEvt = new GuildEvent(c, agentData);
                    GeneralHelper.Add(metaDataEvents.GuildEvents, gEvt.Src, gEvt);
                    break;
                }
            }
        }