public void SendPacket(ServerPacket packet) { if (!IsOpen()) { return; } packet.LogPacket(_worldSession); packet.WritePacketData(); var data = packet.GetData(); uint packetSize = (uint)data.Length; ServerOpcodes opcode = packet.GetOpcode(); PacketLog.Write(data, opcode, GetRemoteIpAddress(), GetRemotePort(), _connectType); if (packetSize > 0x400 && worldCrypt.IsInitialized) { ByteBuffer buffer = new ByteBuffer(); buffer.WriteUInt32(packetSize + 2); buffer.WriteUInt32(ZLib.adler32(ZLib.adler32(0x9827D8F1, BitConverter.GetBytes((ushort)opcode), 2), data, packetSize)); uint compressedSize = CompressPacket(data, opcode); buffer.WriteUInt32(ZLib.adler32(0x9827D8F1, data, compressedSize)); buffer.WriteBytes(data, compressedSize); packetSize = (ushort)(compressedSize + 12); opcode = ServerOpcodes.CompressedPacket; data = buffer.GetData(); } ServerPacketHeader header = new ServerPacketHeader(packetSize, opcode); if (worldCrypt.IsInitialized) { worldCrypt.Encrypt(header.data, 4); } AsyncWrite(header.data.Combine(data)); }