예제 #1
0
        public Packet Receive(Stream processingStream)
        {
            var packetReader = new StreamPacketReader(processingStream, receiveBuffer);
            int packetId     = packetReader.ReadByte();

            if ((packetId < 0) || (packetId > 255))
            {
                throw new EndOfStreamException();
            }

            diagnosticPullStream.StartPacket();
            var packetDefinition = packetRegistry.Find(packetId);
            var packetSize       = packetDefinition.GetSize(packetReader);

            packetReader.ReadBytes(packetSize - packetReader.Position);
            var payload = new byte[packetSize];

            Array.Copy(receiveBuffer, 0, payload, 0, packetSize);

            var packet = new Packet(packetId, payload);

            if (packetId == PacketDefinitions.ConnectToGameServer.Id)
            {
                Status = ServerConnectionStatus.PreGame;
            }

            diagnosticPullStream.FinishPacket(packet);

            return(packet);
        }
예제 #2
0
 public ServerConnection(ServerConnectionStatus status, IDiagnosticPullStream diagnosticPullStream,
                         IDiagnosticPushStream diagnosticPushStream, byte[] newGameKey, uint loginSeed, LoginEncryptionKey loginKey)
     : this(status, diagnosticPullStream, diagnosticPushStream, PacketDefinitionRegistryFactory.CreateClassicClient(), EncryptionSetup.Autodetect)
 {
     InitNewGameEncryption(newGameKey);
     this.loginStream = new LoginPushStream(loginSeed, loginKey);
 }
예제 #3
0
        public void Send(Packet packet, Stream outputStream)
        {
            diagnosticPushStream.DumpPacket(packet);

            switch (Status)
            {
            case ServerConnectionStatus.Initial:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                diagnosticPushStream.Write(packet.Payload, 0, packet.Length);
                Status = ServerConnectionStatus.PreLogin;
                break;

            case ServerConnectionStatus.PreLogin:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                loginStream.BaseStream          = diagnosticPushStream;
                loginStream.Write(packet.Payload, 0, packet.Length);
                break;

            case ServerConnectionStatus.PreGame:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                diagnosticPushStream.Write(packet.Payload, 0, packet.Length);
                Status = ServerConnectionStatus.Game;
                break;

            case ServerConnectionStatus.Game:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                sendNewGameStream.BaseStream    = diagnosticPushStream;
                sendNewGameStream.Write(packet.Payload, 0, packet.Length);
                break;
            }

            diagnosticPushStream.Finish();
        }
예제 #4
0
        public void Send(Packet packet, Stream outputStream)
        {
            diagnosticPushStream.DumpPacket(packet);

            switch (Status)
            {
            case ServerConnectionStatus.Initial:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                // TODO: use seed sent by client
                diagnosticPushStream.Write(new byte[] { 0xA9, 0xFE, 0x50, 0x50 }, 0, 4);
                Status = ServerConnectionStatus.PreLogin;
                break;

            case ServerConnectionStatus.PreLogin:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                loginStream.BaseStream          = new PushStreamToStreamAdapter(diagnosticPushStream);
                loginStream.Write(packet.Payload, 0, packet.Length);
                break;

            case ServerConnectionStatus.PreGame:
                diagnosticPushStream.BaseStream = new StreamToPushStreamAdapter(outputStream);
                diagnosticPushStream.Write(packet.Payload, 0, packet.Length);
                Status = ServerConnectionStatus.Game;
                break;

            case ServerConnectionStatus.Game:
                diagnosticPushStream.BaseStream  = new StreamToPushStreamAdapter(outputStream);
                sendNewGameStream.BasePushStream = new PushStreamToStreamAdapter(diagnosticPushStream);
                sendNewGameStream.Write(packet.Payload, 0, packet.Length);
                break;
            }

            diagnosticPushStream.Finish();
        }
예제 #5
0
 private ServerConnection CreateEncryptedConnection(ServerConnectionStatus status,
                                                    IDiagnosticPullStream diagnosticPullStream, IDiagnosticPushStream diagnosticPushStream)
 {
     return(new ServerConnection(status, diagnosticPullStream,
                                 diagnosticPushStream, newGameKey: new byte[] { 127, 0, 0, 1 },
                                 loginSeed: 0xA9FE5050, loginKey: new LoginEncryptionKey(0x2cc3ed9d, 0xa374227f, 0)));
 }
예제 #6
0
 public ServerConnection(ServerConnectionStatus status, IDiagnosticPullStream diagnosticPullStream,
                         IDiagnosticPushStream diagnosticPushStream)
 {
     this.Status = status;
     this.diagnosticPullStream = diagnosticPullStream;
     this.diagnosticPushStream = diagnosticPushStream;
     huffmanStream             = new HuffmanStream(receiveNewGameStream);
     preLoginStream            = new PullStreamToStreamAdapter(diagnosticPullStream);
 }
예제 #7
0
        public ServerConnection(ServerConnectionStatus status, IDiagnosticPullStream diagnosticPullStream,
                                IDiagnosticPushStream diagnosticPushStream, PacketDefinitionRegistry packetRegistry, EncryptionSetup encryptionSetup)
        {
            this.Status = status;
            this.diagnosticPullStream = diagnosticPullStream;
            this.diagnosticPushStream = diagnosticPushStream;
            this.packetRegistry       = packetRegistry;
            this.encryptionSetup      = encryptionSetup;
            this.loginStream          = new LoginPushStream();

            this.receiveNewGameStream = new ServerNewGamePullStream();
            this.sendNewGameStream    = new ServerNewGamePushStream();

            huffmanStream  = new HuffmanStream(new PullStreamToStreamAdapter(receiveNewGameStream));
            preLoginStream = new PullStreamToStreamAdapter(diagnosticPullStream);
        }
예제 #8
0
 private void client_Disconnected(DisconnectedEventArgs e)
 {
     _isAuth = false;
     _connectionStatus = ServerConnectionStatus.Disconnected;
     mre.Set();
     IsAuth = false;
     ConnectionStatus = ServerConnectionStatus.Disconnected;
 }
예제 #9
0
 private void client_ConnectFailed(ConnectFailedEventArgs e)
 {
     _isAuth = false;
     _connectionStatus = ServerConnectionStatus.Disconnected;
     ConnectError = string.Format("Connection to server failed: {0}:{1}", Server, Port);
     mre.Set();
     IsAuth = false;
     ConnectionStatus = ServerConnectionStatus.Disconnected;
 }
예제 #10
0
 private void client_Connected(ConnectedEventArgs e)
 {
     _connectionStatus = ServerConnectionStatus.Connected;
     mre.Set();
     ConnectionStatus = ServerConnectionStatus.Connected;
 }
예제 #11
0
 public ServerConnection(ServerConnectionStatus status, IDiagnosticPullStream diagnosticPullStream,
                         IDiagnosticPushStream diagnosticPushStream)
     : this(status, diagnosticPullStream, diagnosticPushStream, PacketDefinitionRegistryFactory.CreateClassicClient(), EncryptionSetup.Autodetect)
 {
 }
예제 #12
0
 public ServerConnection(ServerConnectionStatus status)
     : this(status, NullDiagnosticPullStream.Instance, NullDiagnosticPushStream.Instance)
 {
 }
예제 #13
0
 void SetConnectionStatus(ServerConnectionStatus status)
 {
     SafeInvoke(() =>
     {
         switch (status)
         {
             case ServerConnectionStatus.None:
                 tsConnectedStatus.Text = string.Empty;
                 tsConnectedStatus.Image = null;
                 break;
             case ServerConnectionStatus.Connecting:
                 tsConnectedStatus.Text = "Connecting";
                 tsConnectedStatus.Image = Resources.free_connecting_16;
                 break;
             case ServerConnectionStatus.Disconnected:
                 pingTimer.Enabled = false;
                 tsConnectedStatus.Text = "No connection";
                 tsConnectedStatus.Image = Resources.free_disconnect_16;
                 ConnectClosed();
                 SetEnabledButton(true);
                 break;
             case ServerConnectionStatus.Connected:
                 pingTimer.Enabled = true;
                 tsConnectedStatus.Text = "Connected";
                 tsConnectedStatus.Image = Resources.free_connect_16;
                 ConnectOpened();
                 break;
         }
     });
 }
예제 #14
0
 void Instance_ConnectStatusChanged(ServerConnectionStatus status)
 {
     SetConnectionStatus(status);
     if (status == ServerConnectionStatus.Disconnected && cbRestoreConnect.Checked)
     {
         RestoreConnect();
     }
 }
예제 #15
0
 private ServerConnection CreateEncryptedConnection(ServerConnectionStatus status, TextDiagnosticPushStream diagnosticStream)
 => CreateEncryptedConnection(status, NullDiagnosticPullStream.Instance, diagnosticStream);