/// <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); } }
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)); } } }
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 } } }