/// <summary>
        /// Packets are handled here.
        /// </summary>
        /// <param name="id">Packet ID</param>
        /// <param name="data">Packet byte[] data</param>
        private void HandlePacketClassic(int id, byte[] data)
        {
            using (var reader = new MinecraftDataReader(data, NetworkMode))
            {
                if (ServerResponseClassic.ServerResponse[id] == null)
                    return;

                var packet = ServerResponseClassic.ServerResponse[id]().ReadPacket(reader);

                RaisePacketHandled(id, packet, null);
            }
        }
Ejemplo n.º 2
0
        private IAsyncResult BeginWriteWithCompression(byte[] data, AsyncCallback callback, object state)
        {
            int dataLength = 0; // UncompressedData.Length

            // -- data here is raw IPacket with Packet length.
            using (var reader = new MinecraftDataReader(data, Mode))
            {
                var packetLength            = reader.ReadVarInt();
                var packetLengthByteLength1 = GetVarIntBytes(packetLength).Length; // -- Getting size of Packet Length

                var tempBuf1 = new byte[data.Length - packetLengthByteLength1];
                Buffer.BlockCopy(data, packetLengthByteLength1, tempBuf1, 0, tempBuf1.Length); // -- Creating data without Packet Length

                packetLength = tempBuf1.Length + GetVarIntBytes(tempBuf1.Length).Length;       // -- Get first Packet length

                // -- Handling this data like normal
                if (packetLength >= ModernCompressionThreshold) // if Packet length > threshold, compress
                {
                    using (var outputStream = new MemoryStream())
                        using (var inputStream = new DeflaterOutputStream(outputStream, new Deflater(0)))
                        {
                            inputStream.Write(tempBuf1, 0, tempBuf1.Length);
                            inputStream.Close();

                            tempBuf1 = outputStream.ToArray();
                        }

                    dataLength   = tempBuf1.Length;
                    packetLength = dataLength + GetVarIntBytes(tempBuf1.Length).Length; // calculate new packet length
                }


                var packetLengthByteLength = GetVarIntBytes(packetLength);
                var dataLengthByteLength   = GetVarIntBytes(dataLength);

                var tempBuf2 = new byte[tempBuf1.Length + packetLengthByteLength.Length + dataLengthByteLength.Length];

                Buffer.BlockCopy(packetLengthByteLength, 0, tempBuf2, 0, packetLengthByteLength.Length);
                Buffer.BlockCopy(dataLengthByteLength, 0, tempBuf2, packetLengthByteLength.Length, dataLengthByteLength.Length);
                Buffer.BlockCopy(tempBuf1, 0, tempBuf2, packetLengthByteLength.Length + dataLengthByteLength.Length, tempBuf1.Length);

                if (EncryptionEnabled)
                {
                    return(_aesStream.BeginWrite(tempBuf2, 0, tempBuf2.Length, callback, state));
                }
                else
                {
                    return(_stream.BeginWrite(tempBuf2, 0, tempBuf2.Length, callback, state));
                }
            }
        }
Ejemplo n.º 3
0
        private IAsyncResult BeginWriteWithCompression(byte[] data, AsyncCallback callback, object state)
        {
            int dataLength = 0; // UncompressedData.Length

            // -- data here is raw IPacket with Packet length.
            using (var reader = new MinecraftDataReader(data, Mode))
            {
                var packetLength = reader.ReadVarInt();
                var packetLengthByteLength1 = GetVarIntBytes(packetLength).Length; // -- Getting size of Packet Length

                var tempBuf1 = new byte[data.Length - packetLengthByteLength1];
                Buffer.BlockCopy(data, packetLengthByteLength1, tempBuf1, 0, tempBuf1.Length); // -- Creating data without Packet Length

                packetLength = tempBuf1.Length + GetVarIntBytes(tempBuf1.Length).Length; // -- Get first Packet length

                // -- Handling this data like normal
                if (packetLength >= ModernCompressionThreshold) // if Packet length > threshold, compress
                {
                    using (var outputStream = new MemoryStream())
                    using (var inputStream = new DeflaterOutputStream(outputStream, new Deflater(0)))
                    {
                        inputStream.Write(tempBuf1, 0, tempBuf1.Length);
                        inputStream.Close();

                        tempBuf1 = outputStream.ToArray();
                    }

                    dataLength = tempBuf1.Length;
                    packetLength = dataLength + GetVarIntBytes(tempBuf1.Length).Length; // calculate new packet length
                }


                var packetLengthByteLength = GetVarIntBytes(packetLength);
                var dataLengthByteLength = GetVarIntBytes(dataLength);

                var tempBuf2 = new byte[tempBuf1.Length + packetLengthByteLength.Length + dataLengthByteLength.Length];

                Buffer.BlockCopy(packetLengthByteLength, 0, tempBuf2, 0                                                          , packetLengthByteLength.Length);
                Buffer.BlockCopy(dataLengthByteLength  , 0, tempBuf2, packetLengthByteLength.Length                              , dataLengthByteLength.Length);
                Buffer.BlockCopy(tempBuf1              , 0, tempBuf2, packetLengthByteLength.Length + dataLengthByteLength.Length, tempBuf1.Length);

                if (EncryptionEnabled)
                    return _aesStream.BeginWrite(tempBuf2, 0, tempBuf2.Length, callback, state);
                else
                    return _stream.BeginWrite(tempBuf2, 0, tempBuf2.Length, callback, state);
            }
        }
        /// <summary>
        /// Packets are handled here. Compression and encryption are handled here too
        /// </summary>
        /// <param name="id">Packet ID</param>
        /// <param name="data">Packet byte[] data</param>
        private void HandlePacketModern(int id, byte[] data)
        {
            using (var reader = new MinecraftDataReader(data, NetworkMode))
            {
                IPacket packet;

                switch (_minecraft.State)
                {
                    #region Status

                    case ServerState.ModernStatus:
                        if (ServerResponse.Status[id] == null)
                            break;

                        packet = ServerResponse.Status[id]().ReadPacket(reader);

                        RaisePacketHandled(id, packet, ServerState.ModernStatus);

                        break;

                    #endregion Status

                    #region Login

                    case ServerState.ModernLogin:
                        if (ServerResponse.Login[id] == null)
                            break;

                        packet = ServerResponse.Login[id]().ReadPacket(reader);

                        RaisePacketHandled(id, packet, ServerState.ModernLogin);

                        if (id == 0x01)
                            ModernEnableEncryption(packet);  // -- Low-level encryption handle

                        if (id == 0x03)
                            ModernSetCompression(packet); // -- Low-level compression handle

                        break;

                    #endregion Login

                    #region Play

                    case ServerState.ModernPlay:
                        if (ServerResponse.Play[id] == null)
                            break;

                        packet = ServerResponse.Play[id]().ReadPacket(reader);

                        if (ServerResponse.Play[id]() == null)
                            throw new Exception("");

                        RaisePacketHandled(id, packet, ServerState.ModernPlay);

                        if (id == 0x46)
                            ModernSetCompression(packet); // -- Low-level compression handle

                        // Connection lost
                        if (id == 0x40)
                            Crashed = true;

                        break;

                    #endregion Play
                }
            }
        }