コード例 #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
ファイル: 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);
            }
        }
コード例 #3
0
ファイル: PlayerEntity.cs プロジェクト: LiveMC/SharpMC
 public void SavePlayer()
 {
     byte[] health = HealthManager.Export();
     byte[] inv = Inventory.GetBytes();
     DataBuffer buffer = new DataBuffer(new byte[0]);
     buffer.WriteDouble(KnownPosition.X);
     buffer.WriteDouble(KnownPosition.Y);
     buffer.WriteDouble(KnownPosition.Z);
     buffer.WriteFloat(KnownPosition.Yaw);
     buffer.WriteFloat(KnownPosition.Pitch);
     buffer.WriteBool(KnownPosition.OnGround);
     buffer.WriteVarInt((int)Gamemode);
     buffer.WriteVarInt(health.Length);
     foreach (byte b in health)
     {
         buffer.WriteByte(b);
     }
     buffer.WriteVarInt(inv.Length);
     foreach (byte b in inv)
     {
         buffer.WriteByte(b);
     }
     byte[] data = buffer.ExportWriter;
     data = Globals.Compress(data);
     string savename = ServerSettings.OnlineMode ? Uuid : Username;
     File.WriteAllBytes("Players/" + savename + ".pdata", data);
 }
コード例 #4
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;
        }