Ejemplo n.º 1
0
            TPeerCnt _UnLinkCore()
            {
                if (_Key == null)
                {
                    return(TPeerCnt.MaxValue);
                }

                if (_Socket != null)
                {
                    _Socket.Close();
                    _Socket = null;
                }
                _RecvHeader    = null;
                _StreamSndTail = 0;
                _RecvPacketSeq = 0;
                _SendPacketSeq = 0;
                _StreamRcv.Clear();
                _StreamSnd.Clear();
                _LongIP         = 0;
                _Sending        = false;
                _Connected      = false;
                _ConnectTime    = 0;
                _ConnectTimeOut = 0;
                _Connecting     = false;

                var PeerNum = _Key.PeerNum;

                _Key = null;

                return(PeerNum);
            }
Ejemplo n.º 2
0
            void _RecvA(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                if (_Clients[(Int32)Key_.PeerNum].IsCheck())
                {
                    switch (Header.Proto)
                    {
                    case EProto.AcCheck: _RecvAcCheck(Key_, Stream_); return;

                    case EProto.AcCheckFail: _RecvAcCheckFail(Key_, Stream_); return;

                    default: _CheckFailAndClose(Key_.PeerNum, EGameRet.InvalidPacket); return;
                    }
                }
                else
                {
                    switch (Header.Proto)
                    {
                    case EProto.AcLogin: _RecvAcLogin(Key_, Stream_); return;

                    case EProto.AcLoginFail: _RecvAcLoginFail(Key_, Stream_); return;

                    default: _LoginFailAndCloseA(Key_.PeerNum, EGameRet.InvalidPacket); return;
                    }
                }
            }
Ejemplo n.º 3
0
 public TdfReader()
 {
     Bitmap  = new SBitmap();
     Version = new SVersion();
     Header  = new SHeader
     {
         Date = new SDate()
     };
 }
Ejemplo n.º 4
0
            void _RecvM(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                switch (Header.Proto)
                {
                case EProto.McLogin: _RecvMcLogin(Key_, Stream_); return;

                case EProto.McLoginFail: _RecvMcLoginFail(Key_, Stream_); return;

                default: _NetM.Close(Key_); return;
                }
            }
Ejemplo n.º 5
0
            void _RecvS(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                switch (Header.Proto)
                {
                case EProto.ScLogin: _RecvScLogin(Key_, Stream_); return;

                case EProto.ScLoginFail: _RecvScLoginFail(Key_, Stream_); return;

                case EProto.ScUserProto: _RecvFunc(Key_, Stream_); return;

                default: _NetS.Close(Key_); return;
                }
            }
Ejemplo n.º 6
0
        public TdfFile()
        {
            Bitmap  = new SBitmap();
            Version = new SVersion();
            Header  = new SHeader
            {
                Date = new SDate()
            };
            Header.Date.Day   = (char)DateTime.Now.Day;
            Header.Date.Month = (char)DateTime.Now.Month;
            Header.Date.Year  = (ushort)DateTime.Now.Year;

            Bitmap.BfType    = 19778;
            Bitmap.BfSize    = 21054;
            Bitmap.BfOffBits = 54;
            Version.Major    = 1;
            Version.Minor    = 4;
        }
Ejemplo n.º 7
0
            void _RecvS(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                try
                {
                    switch (Header.Proto)
                    {
                    case EProto.ScPatchData:
                        _RecvScPatchData(Key_, Stream_);
                        return;

                    default:
                        throw new Exception();
                    }
                }
                catch
                {
                    _NetB.Close(Key_.PeerNum);
                }
            }
Ejemplo n.º 8
0
            void _RecvS(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                if (!_Servers[(Int32)Key_.PeerNum].Logon)
                {
                    switch (Header.Proto)
                    {
                    case EProto.ScNewParent:
                        _RecvScNewParent(Key_, Stream_);
                        return;

                    case EProto.ScAllocated:
                        _RecvScAllocated(Key_, Stream_);
                        return;

                    default:
                        _NetS.Close(Key_.PeerNum);
                        return;
                    }
                }
                else
                {
                    switch (Header.Proto)
                    {
                    case EProto.ScUserProto:
                        _RecvFuncS(Key_, Stream_);
                        return;

                    default:
                        _NetS.Close(Key_.PeerNum);
                        return;
                    }
                }
            }
Ejemplo n.º 9
0
 public SHeader(SHeader Obj_)
 {
     Proto = Obj_.Proto;
 }
Ejemplo n.º 10
0
 public void Set(SHeader Obj_)
 {
     Proto = Obj_.Proto;
 }
Ejemplo n.º 11
0
            void _Recved() // 수신 처리
            {
                if (_RecvEvent.SocketError != SocketError.Success)
                {
                    _UnLink(ENetState.Normal);
                    return;
                }

                if (_RecvEvent.BytesTransferred == 0)
                {
                    _UnLink(ENetState.Normal);
                    return;
                }

                _HBRcvPeriod.NextLoose();

                if (!_StreamRcv.Push(_aRecvBuf.SubArray(0, _RecvEvent.BytesTransferred)))
                {
                    _UnLink(ENetState.Normal);
                    return;
                }

                while (true)
                {
                    // For Header /////////////////////
                    if (_RecvHeader == null)
                    {
                        if (_StreamRcv.Size < c_HeaderSize)
                        {
                            break;
                        }

                        try
                        {
                            _RecvHeader = new SHeader();
                        }
                        catch
                        {
                            _UnLink(ENetState.Normal);
                            return;
                        }

                        if (!_StreamRcv.Pop(_RecvHeader))
                        {
                            _UnLink(ENetState.Normal);
                            return;
                        }
                    }

                    // For Body /////////////////////
                    if (_StreamRcv.Size < _RecvHeader.Size)
                    {
                        break;
                    }

                    if (_RecvHeader.Size > 0)
                    {
                        if (_RecvHeader.PacketSeq <= _RecvPacketSeq &&
                            (_RecvPacketSeq - _RecvHeader.PacketSeq) < (TPacketSeq.MaxValue << 1))
                        {
                            _UnLink(ENetState.Normal);
                            return;
                        }
                        _RecvPacketSeq = _RecvHeader.PacketSeq;

                        var Body = _StreamRcv.GetStream(_RecvHeader.Size);
                        _Crypto.Decode(Body, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.PacketSeq));
                        for (int i = 0; i < Body.Count(); ++i)
                        {
                            _StreamRcv.SetAt(_StreamRcv.Head + i, Body[i]);
                        }

                        if (_RecvHeader.CheckSum != CBase.GetCheckSum(Body))
                        {
                            _UnLink(ENetState.Normal);
                            return;
                        }

                        var OldSize = _StreamRcv.Size;
                        var OldHead = _StreamRcv.Head;
                        var OldTail = _StreamRcv.Tail;
                        _StreamRcv.Tail = _StreamRcv.Head + _RecvHeader.Size;   // For Notifying Received Size to RecvFunc

                        _RecvFunc(_Key.PeerNum, _StreamRcv);

                        if (_Key == null)
                        {
                            return;
                        }

                        // 외부에서 모두 Pop하지 않았거나 Stream에 대해서 Clear 하지 않아도 상관 없으므로 에러 체크하지 않음.
                        //if (_StreamRcv.Size != OldSize - _RecvHeader.Size)
                        //    throw new Exception("Did Not Receive Whole Protocol");

                        if (OldSize > _RecvHeader.Size)
                        {
                            _StreamRcv.Head = OldHead + _RecvHeader.Size;
                            _StreamRcv.Tail = OldTail;
                        }
                        else
                        {
                            _StreamRcv.Clear();
                        }
                    }

                    _RecvHeader = null;
                }

                if (_Socket == null)
                {
                    return;
                }

                if (!_Recv())
                {
                    _UnLink(ENetState.Normal);
                    return;
                }
            }
Ejemplo n.º 12
0
 public void Set(SHeader Obj_)
 {
     Size          = Obj_.Size;
     CheckSum      = Obj_.CheckSum;
     SendPacketSeq = Obj_.SendPacketSeq;
 }
Ejemplo n.º 13
0
 public SHeader(SHeader Obj_)
 {
     Size      = Obj_.Size;
     CheckSum  = Obj_.CheckSum;
     PacketSeq = Obj_.PacketSeq;
 }
Ejemplo n.º 14
0
        // Controlador de pacotes
        public static void Controller(Client client, byte[] data)
        {
            lock (Lock)
            {
                SHeader header = PConvert.ToStruct <SHeader>(data);

                Log.Rcv(client, header);

                if (header.PacketId == 0x03A0)
                {
                    if (header.Size != 12 || data.Length != 12)
                    {
                        client.Close();
                    }

                    return;
                }

                switch (client.Status)
                {
                case ClientStatus.Login:
                {
                    switch (header.PacketId)
                    {
                    case 0x20D: P_20D.Controller(client, PConvert.ToStruct <P_20D>(data)); break;             // Login

                    default: client.Close(); break;
                    }

                    break;
                }

                case ClientStatus.Numeric:
                {
                    switch (header.PacketId)
                    {
                    case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE>(data)); break;             // Senha numérica

                    default: client.Close(); break;
                    }

                    break;
                }

                case ClientStatus.Characters:
                {
                    switch (header.PacketId)
                    {
                    case 0x020F: P_20F.Controller(client, PConvert.ToStruct <P_20F>(data)); break;            // Criar personagem

                    case 0x0211: P_211.Controller(client, PConvert.ToStruct <P_211>(data)); break;            // Apagar personagem

                    case 0x0213: P_213.Controller(client, PConvert.ToStruct <P_213>(data)); break;            // Entrar no mundo

                    case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE>(data)); break;             // Alterar senha numérica

                    default: client.Close(); break;
                    }

                    break;
                }

                case ClientStatus.Game:
                {
                    switch (header.PacketId)
                    {
                    case 0x0291: P_291.Controller(client, PConvert.ToStruct <P_291>(data)); break;                   // Depois que entra no mundo

                    case 0x0333: P_333.Controller(client, PConvert.ToStruct <P_333>(data)); break;                   // Chat aberto

                    case 0x0366: break;                                                                              // Andar porém quando para de pressionar o mouse

                    case 0x036C: P_36C.Controller(client, PConvert.ToStruct <P_36C>(data)); break;                   // Andar

                    case 0x03AE: break;                                                                              // 5 segundos

                    case 0x0215: P_215.Controller(client, PConvert.ToStruct <P_215>(data)); break;                   // volta para tela de personagem

                    case 0x0290: P_290.Controller(client); break;                                                    // teletransporte

                    case 0x027B: P_27B.controller(client, PConvert.ToStruct <P_27B>(data)); break;                   // Abre o NPC de venda/skill

                    case 0x0379: P_379.controller(client, PConvert.ToStruct <P_379>(data)); break;                   // Compra de item do NPC

                    case 0x037A: P_37A.controller(client, PConvert.ToStruct <P_37A>(data)); break;                   // Vende o item para o NPC

                    case 0x0376: P_376.controller(client, PConvert.ToStruct <P_376>(data)); break;                   // Move o Item

                    case 0x0387: P_387.Controller(client, PConvert.ToStruct <P_387>(data)); break;                   // Envia o dinheiro para o inventario

                    case 0x0388: P_388.Controller(client, PConvert.ToStruct <P_388>(data)); break;                   // Envia o dinheiro para o bau

                    case 0x0367:
                    case 0x039D: P_39D.controller(client, PConvert.ToStruct <P_39D>(data)); break;                   // Ataque ao Mobs/Players (nao esta pronto)

                    //case 0x02CB: P_2CB.controller(client, PConvert.ToStruct<P_2CB>(data)); break;      // UNKNOW
                    //case 0x036B:                                                                       // unknow
                    case 0x0277: P_277.controller(client, PConvert.ToStruct <P_277>(data)); break;                   // Adiciona os pontos de status e skill

                    case 0x0378: P_378.controller(client, PConvert.ToStruct <P_378>(data)); break;                   // Adiciona a skill na barra de skill

                    case 0x0373: P_373.controller(client, PConvert.ToStruct <P_373>(data)); break;                   // Trata o uso de item (nao esta pronto)

                    case 0x02E4: P_2E4.controller(client, PConvert.ToStruct <P_2E4>(data)); break;                   // Deleta o Item

                    case 0x0334: P_334.controller(client, PConvert.ToStruct <P_334>(data)); break;                   // Comando do chat

                    case 0x0369: P_369.controller(client, PConvert.ToStruct <P_369>(data)); break;                   // Respaw Mob (nao esta pronto)

                    case 0x037F: P_37F.controller(client, PConvert.ToStruct <P_37F>(data)); break;                   // Envia uma requicao de grupo

                    case 0x03AB: P_3AB.controller(client, PConvert.ToStruct <P_3AB>(data)); break;                   // Aceita a requisicao de grupo

                    case 0x037E: P_37E.controller(client, PConvert.ToStruct <P_37E>(data)); break;                   // Remove um membro do grupo

                    case 0x028B: P_28B.controller(client, PConvert.ToStruct <P_28B>(data)); break;                   // Trata os npc de quest, buff e etc

                    default: client.Send(P_101.New($"UNK:0x { header.PacketId.ToString("X").PadLeft(4, '0')}")); break;
                    }

                    break;
                }
                }
            }
        }
Ejemplo n.º 15
0
 public void RecvedEnd()
 {
     StreamRcv.LoadState();
     StreamRcv.Pop(_RecvHeader.Size);
     _RecvHeader = null;
 }
Ejemplo n.º 16
0
            public ERecvState RecvedBegin()
            {
                // For Header /////////////////////
                if (_RecvHeader == null)
                {
                    if (StreamRcv.Size < _HeaderSize)
                    {
                        return(ERecvState.NoData);
                    }

                    _RecvHeader = new SHeader();
                    _RecvHeader.Push(StreamRcv);
                }

                // For Body /////////////////////
                if (StreamRcv.Size < _RecvHeader.Size)
                {
                    return(ERecvState.NoData);
                }

                if (_RecvHeader.SendPacketSeq != (_RecvPacketSeq + 1))
                {
                    throw new Exception("PacketSeq Error " + _RecvHeader.SendPacketSeq.ToString() + ", " + (_RecvPacketSeq + 1).ToString());
                }

                _RecvPacketSeq = _RecvHeader.SendPacketSeq;
                _Crypto.Decode(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.SendPacketSeq));

                if (_RecvHeader.CheckSum != core.CBase.GetCheckSum(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size))
                {
                    throw new Exception("CheckSum Error");
                }

                var OldStreamSize = StreamRcv.Size;
                var Header2       = new SHeader2();

                Header2.Push(StreamRcv);
                _RecvHeader.Size -= (OldStreamSize - StreamRcv.Size);
                StreamRcv.SaveState();

                switch (Header2.PacketType)
                {
                case EPacketType.Ping:
                    if (!_SendPong())
                    {
                        throw new Exception("_SendPong Fail");
                    }

                    return(ERecvState.PingPong);

                case EPacketType.Pong:
                    if (Header2.RecvPacketSeq == _PingPacketSeq)
                    {
                        _Latency  = DateTime.Now - _PingTime.Value;
                        _PingTime = null;
                    }
                    return(ERecvState.PingPong);

                case EPacketType.User:
                    break;

                default:
                    throw new Exception("Invalid Packet Type");
                }

                return(ERecvState.UserData);
            }
Ejemplo n.º 17
0
        // Controlador de pacotes
        public static void Controller(Client client, byte [] data)
        {
            lock ( Lock ) {
                SHeader header = PConvert.ToStruct <SHeader> (data);

                Log.Rcv(client, header);

                if (header.PacketId == 0x03A0)
                {
                    if (header.Size != 12 || data.Length != 12)
                    {
                        client.Close( );
                    }

                    return;
                }

                switch (client.Status)
                {
                case ClientStatus.Login: {
                    switch (header.PacketId)
                    {
                    case 0x20D: P_20D.Controller(client, PConvert.ToStruct <P_20D> (data)); break;                                           // Login

                    default: client.Close( ); break;
                    }

                    break;
                }

                case ClientStatus.Numeric: {
                    switch (header.PacketId)
                    {
                    case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE> (data)); break;                                           // Senha numérica

                    default: client.Close( ); break;
                    }

                    break;
                }

                case ClientStatus.Characters: {
                    switch (header.PacketId)
                    {
                    case 0x020F: P_20F.Controller(client, PConvert.ToStruct <P_20F> (data)); break;                                          // Criar personagem

                    case 0x0211: P_211.Controller(client, PConvert.ToStruct <P_211> (data)); break;                                          // Apagar personagem

                    case 0x0213: P_213.Controller(client, PConvert.ToStruct <P_213> (data)); break;                                          // Entrar no mundo

                    case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE> (data)); break;                                           // Alterar senha numérica

                    default: client.Close( ); break;
                    }

                    break;
                }

                case ClientStatus.Game: {
                    switch (header.PacketId)
                    {
                    case 0x0291: break;                                                                                        // Depois que entra no mundo

                    case 0x0333: P_333.Controller(client, PConvert.ToStruct <P_333> (data)); break;                            // Chat aberto

                    case 0x0366:                                                                                               // Andar porém quando para de pressionar o mouse
                    case 0x036C: P_36C.Controller(client, PConvert.ToStruct <P_36C> (data), header.PacketId == 0x036C); break; // Andar

                    case 0x03AE: break;                                                                                        // 5 segundos

                    default: client.Send(P_101.New($"UNK: 0x{header.PacketId.ToString ( "X" ).PadLeft ( 4 , '0' )}")); break;
                    }

                    break;
                }
                }
            }
        }