コード例 #1
0
ファイル: DataBuffer.cs プロジェクト: wickedlizerd/SharpMC
        /// <summary>
        ///     Flush all data to the TCPClient NetworkStream.
        /// </summary>
        public void FlushData(bool quee = false)
        {
            try
            {
                var allData = _bffr.ToArray();
                _bffr.Clear();

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

                    //Calculate length of 'Data Length'
                    byte[] dLength = GetVarIntBytes(dataLength);

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

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

                    Console.WriteLine();

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

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

                    Console.WriteLine();

                    _client.AddToQuee(compressed.ExportWriter, quee);
                }
                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.AddToQuee(data.ToArray(), quee);
                }
                _bffr.Clear();
            }
            catch (Exception ex)
            {
                //	ConsoleFunctions.WriteErrorLine("Failed to send a packet!\n" + ex);
                Globals.ClientManager.PacketError(_client, ex);
            }
        }
コード例 #2
0
ファイル: ChunkColumn.cs プロジェクト: LiveMC/SharpMC
        public byte[] GetBytes(bool unloader = false)
        {
            var writer = new DataBuffer(new byte[0]);
            if (!unloader)
            {
                writer.WriteInt(X);
                writer.WriteInt(Z);
                writer.WriteBool(true);
                writer.WriteUShort(0xffff); // bitmap
                writer.WriteVarInt((Blocks.Length*2) + Skylight.Data.Length + Blocklight.Data.Length + BiomeId.Length);

                for (var i = 0; i < Blocks.Length; i++)
                {
                    writer.WriteUShort((ushort) ((Blocks[i] << 4) | Metadata[i]));
                }

                writer.Write(Blocklight.Data);
                writer.Write(Skylight.Data);

                writer.Write(BiomeId);
            }
            else
            {
                writer.WriteInt(X);
                writer.WriteInt(Z);
                writer.WriteBool(true);
                writer.WriteUShort(0);
                writer.WriteVarInt(0);
            }
            return writer.ExportWriter;
        }
コード例 #3
0
ファイル: DataBuffer.cs プロジェクト: LiveMC/SharpMC
        /// <summary>
        ///     Flush all data to the TCPClient NetworkStream.
        /// </summary>
        public void FlushData(bool quee = false)
        {
            try
            {
                var allData = _bffr.ToArray();
                _bffr.Clear();

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

                    //Calculate length of 'Data Length'
                    byte[] dLength = GetVarIntBytes(dataLength);

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

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

                    Console.WriteLine();

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

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

                    Console.WriteLine();

                    _client.AddToQuee(compressed.ExportWriter, quee);
                }
                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.AddToQuee(data.ToArray(), quee);
                }
                _bffr.Clear();
            }
            catch (Exception ex)
            {
            //	ConsoleFunctions.WriteErrorLine("Failed to send a packet!\n" + ex);
                Globals.ClientManager.PacketError(_client, ex);
            }
        }
コード例 #4
0
ファイル: ChunkColumn.cs プロジェクト: LiveMC/SharpMC
        public byte[] Export()
        {
            var buffer = new DataBuffer(new byte[0]);

            buffer.WriteInt(Blocks.Length);

            for (var i = 0; i < Blocks.Length; i++)
                buffer.WriteUShort(Blocks[i]);

            buffer.WriteInt(Blocks.Length);
            for (var i = 0; i < Blocks.Length; i++)
                buffer.WriteUShort((ushort) Metadata[i]);

            buffer.WriteInt(Blocklight.Data.Length);
            buffer.Write(Blocklight.Data);

            buffer.WriteInt(Skylight.Data.Length);
            buffer.Write(Skylight.Data);

            buffer.WriteInt(BiomeId.Length);
            buffer.Write(BiomeId);

            return buffer.ExportWriter;
        }