Exemplo n.º 1
0
        private void PacketHandler(string pid, byte[] message)
        {
            var opcode = BitConverter.ToUInt16(message, 18);

            if (opcode != GamePacket.Current.OpFate &&
                opcode != GamePacket.Current.OpDuty &&
                opcode != GamePacket.Current.OpMatch &&
                opcode != GamePacket.Current.OpInstance &&
                opcode != 0x299                 // 특수: 5.35 보즈야 서던 프론트 크리티컬 인게이지먼트
                )
            {
                return;
            }

            var data = message.Skip(32).ToArray();

            // FATE
            if (opcode == GamePacket.Current.OpFate)
            {
                if (data[0] == GamePacket.Current.FateIndex)
                {
                    var  fcode      = BitConverter.ToUInt16(data, 4);
                    bool isselected = Settings.SelectedFates.Contains(fcode.ToString());

                    if (Settings.LoggingWholeFates || isselected)
                    {
                        var fate = GameData.GetFate(fcode);

                        Mesg.Fate("l-fate-occured-info", fate.Name);

                        if (isselected)
                        {
                            PlayEffectSound(txtSoundFate.Text);
                            _frmOverlay.EventFate(fate);

                            if (_use_notify)
                            {
                                NotifyFate(fate);
                            }
                        }
                    }
                }
            }
            // 듀티
            else if (opcode == GamePacket.Current.OpDuty)
            {
                // 안쓴다
                // var status = data[0];
                // var reason = data[4];
                var rcode = data[GamePacket.Current.DutyRoulette];

                if (rcode != 0)
                {
                    // 루렛
                    var roulette = GameData.GetRoulette(rcode);

                    Mesg.Duty("i-queue-roulette", roulette.Name);

                    _frmOverlay.EventQueue(roulette.Name);
                }
                else
                {
                    // 직접 골라 큐
                    var insts = new List <int>();
                    for (var i = 0; i < 5; i++)
                    {
                        var icode = BitConverter.ToUInt16(data, GamePacket.Current.DutyInstance + (i * 4));
                        if (icode == 0)
                        {
                            break;
                        }
                    }

                    if (insts.Any())
                    {
                        Mesg.Duty("i-queue-instance", string.Join(", ", insts.Select(x => GameData.GetInstance(x).Name).ToArray()));

                        _frmOverlay.EventStatus(insts.Count);
                    }
                }

                //임무에 들어가면 미션은 모두 해제
                _missions.Clear();
            }
            // 매치
            else if (opcode == GamePacket.Current.OpMatch)
            {
                var    rcode = BitConverter.ToUInt16(data, GamePacket.Current.MatchRoulette);
                var    icode = BitConverter.ToUInt16(data, GamePacket.Current.MatchInstance);
                string name;

                if (icode == 0 && rcode != 0)
                {
                    // 이것 루렛 매칭
                    var roulette = GameData.GetRoulette(rcode);

                    Mesg.Duty("i-matched", roulette.Name);
                    name = roulette.Name;
                }
                else if (icode != 0)
                {
                    // 이건 골라 매칭
                    var instance = GameData.GetInstance(icode);

                    Mesg.Duty("i-matched", instance.Name);
                    name = instance.Name;
                }
                else
                {
                    // 루렛도 인스도 아녀
                    name = Mesg.GetText("l-unknown-instance", icode);
                }

                PlayEffectSound(txtSoundFile.Text);
                _frmOverlay.EventMatch(name);

                if (_use_notify)
                {
                    NotifyMatch(name);
                }
            }
            // 인스턴스 관련
            else if (opcode == GamePacket.Current.OpInstance && GamePacket.Current.OpInstance != 0)
            {
                if (data[4] == 0)
                {
                    // 0은 최초 입장때만 나오므로 이거 쓰자
                    var icode    = BitConverter.ToUInt16(data, GamePacket.Current.InstanceInstance);
                    var instance = GameData.GetInstance(icode);

                    Mesg.Duty("l-instance-enter", instance.Name);

                    _frmOverlay.EventMatch(Mesg.GetText("l-instance-enter", instance.Name));

                    if (_use_notify)
                    {
                        NotifyMatch(instance.Name);
                    }

                    // 미션...이 처리가되나
                    _missions.Clear();
                }
                else
                {
                    // 조용히 시키자
                    _frmOverlay.EventNone();
                }
            }
            // 5.35 보즈야 서던 프론트 크리티컬 인게이지먼트
            else if (opcode == 0x299)
            {
                //  0[4] 타임스탬프
                //  4[2] 남은시간 (mmss)
                //  6[2] ?
                //  8[1] 코드
                //  9[1] ?
                // 10[1] 상태 0=끝, 1=알림/모집, 2=??, 3=진행
                // 12[1] 진행 퍼센트

                int ce = 30000 + data[8];                       // 30000번대 페이트로 취급

                if (data[10] == 0 /* || data[10] == 3 */)       // 3은 진행했으면 알릴 의미가 없기 때문인데, 일단 패스
                {
                    // 제거
                    if (_missions.ContainsKey(ce))
                    {
                        // 미션 목록에서 뺀다
                        _missions.TryRemove(ce, out _);
                    }
                }
                else if (data[10] == 1)
                {
                    // 알림
                    if (!_missions.ContainsKey(ce))
                    {
                        // 미션 목록에 없으면 넣는다
                        _missions.TryAdd(ce, 0);

                        // 일단 페이트 취급
                        bool isselected = Settings.SelectedFates.Contains(ce.ToString());

                        if (Settings.LoggingWholeFates || isselected)
                        {
                            var fate = GameData.GetFate(ce);

                            Mesg.Fate("l-fate-occured-info", fate.Name);

                            if (isselected)
                            {
                                PlayEffectSound(txtSoundFate.Text);
                                _frmOverlay.EventFate(fate);

                                if (_use_notify)
                                {
                                    NotifyFate(fate);
                                }
                            }
                        }
                    }
                }
            }
        }