Exemple #1
0
        /*
         * TODO: Compression issue here?
         */
        /// <summary>
        ///     Flush all data to the TCPClient NetworkStream.
        /// </summary>
        public void FlushData(bool queue = false)
        {
            try
            {
                var allData = _bffr.ToArray();
                _bffr.Clear();

                if (Server.ServerSettings.UseCompression && _client.PacketMode == PacketMode.Play && _client.SetCompressionSend)
                {
                    var isOver     = (allData.Length >= Server.ServerSettings.CompressionThreshold);
                    var dataLength = isOver ? allData.Length : 0;

                    //Calculate length of 'Data Length'
                    var dLength = GetVarIntBytes(dataLength);

                    //Create all data
                    var compressedBytes = ZlibStream.CompressBuffer(allData);
                    var packetLength    = compressedBytes.Length + dLength.Length;
                    var dataToSend      = isOver ? compressedBytes : allData;

                    var compressed = new DataBuffer(_client);
                    compressed.WriteVarInt(packetLength);
                    compressed.WriteVarInt(dataLength);
                    compressed.Write(dataToSend);

                    System.Console.WriteLine();

                    System.Console.WriteLine("Packet bigger than Threshold: " + isOver);
                    System.Console.WriteLine("Packet info: ");

                    System.Console.WriteLine("(Header) Packet Length: " + packetLength);
                    System.Console.WriteLine("(Header) Data Length: " + dataLength);
                    System.Console.WriteLine("Data Length " + dataToSend.Length);
                    System.Console.WriteLine("Length difference: " + (packetLength - dataToSend.Length));

                    System.Console.WriteLine();

                    _client.AddToQueue(compressed.ExportWriter, queue);
                }
                else
                {
                    WriteVarInt(allData.Length);
                    var buffer = _bffr.ToArray();

                    var data = new List <byte>();
                    foreach (var i in buffer)
                    {
                        data.Add(i);
                    }
                    foreach (var i in allData)
                    {
                        data.Add(i);
                    }
                    _client.AddToQueue(data.ToArray(), queue);
                }
                _bffr.Clear();
            }
            catch (Exception ex)
            {
                Globals.ClientManager.PacketError(_client, ex);
            }
        }