Beispiel #1
0
        public BuffFormula(CombatItem evtcItem, BuffInfoEvent buffInfoEvent)
        {
            _buffInfoEvent = buffInfoEvent;
            _npc           = evtcItem.IsFlanking == 0;
            _player        = evtcItem.IsShields == 0;
            _break         = evtcItem.IsOffcycle > 0;
            byte[] formulaBytes = new byte[8 * sizeof(float)];
            int    offset       = 0;

            // 2
            foreach (byte bt in BitConverter.GetBytes(evtcItem.Time))
            {
                formulaBytes[offset++] = bt;
            }
            // 2
            foreach (byte bt in BitConverter.GetBytes(evtcItem.SrcAgent))
            {
                formulaBytes[offset++] = bt;
            }
            // 2
            foreach (byte bt in BitConverter.GetBytes(evtcItem.DstAgent))
            {
                formulaBytes[offset++] = bt;
            }
            // 1
            foreach (byte bt in BitConverter.GetBytes(evtcItem.Value))
            {
                formulaBytes[offset++] = bt;
            }
            // 1
            foreach (byte bt in BitConverter.GetBytes(evtcItem.BuffDmg))
            {
                formulaBytes[offset++] = bt;
            }
            //
            float[] formulaFloats = new float[8];
            Buffer.BlockCopy(formulaBytes, 0, formulaFloats, 0, formulaBytes.Length);
            //
            Type              = (int)formulaFloats[0];
            ByteAttr1         = (byte)formulaFloats[1];
            ByteAttr2         = (byte)formulaFloats[2];
            Attr1             = ParseEnum.GetBuffAttribute(ByteAttr1);
            Attr2             = ParseEnum.GetBuffAttribute(ByteAttr2);
            ConstantOffset    = formulaFloats[3];
            LevelOffset       = formulaFloats[4];
            Variable          = formulaFloats[5];
            TraitSrc          = (int)formulaFloats[6];
            TraitSelf         = (int)formulaFloats[7];
            _extraNumber      = evtcItem.OverstackValue;
            _extraNumberState = evtcItem.Pad1;
        }
        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;
                }
            }
        }