public SOEPacket GetFinalSOEPacket(SOEClient client, bool compressed, bool appendCRC) { // Data byte[] originalPacket = GetRaw(); byte[] rawData = new byte[Data.Count - 2]; byte[] newPacket; // Fail-safe ushort originalOpCode = 0; // Are we a message? if (IsMessage) { // Yes, so we'll try make a data packet. // Can we fit into one packet? SOEMessage message = GetFinalSOEMessage(client); if (message.IsFragmented) { // We're gonna have to fragment, so we can't handle this gracefully... client.Server.Log("[ERROR] Tried to handle 'GetFinalSOEPacket' call on written SOEMessage gracefully but failed due to fragmentation. Returning null."); client.Server.Log("[INFO] Call 'GetFinalSOEMessage' as it deals with fragmentation!"); // Welp, goodbye world! :'( return null; } // Make the new packet Data = new List<byte>(); AddUInt16(client.GetNextSequenceNumber()); AddBytes(originalPacket); // Set our raw data rawData = GetRaw(); // Change our OpCode so that we're a reliable data packet originalOpCode = OpCode; OpCode = (ushort)SOEOPCodes.RELIABLE_DATA; // Because we're reliable data, take compression into consideration and append a CRC compressed = true; appendCRC = true; // We handled it gracefully! :) client.Server.Log("[INFO] Handled 'GetFinalSOEPacket' call on written SOEMessage gracefully."); } else { // Get just the data for this packet. (Remove the OP Code) byte[] completeRawData = GetRaw(); for (int i = 2; i < completeRawData.Length; i++) { rawData[i - 2] = completeRawData[i]; } } // Start a new packet Data = new List<byte>(); AddUInt16(OpCode); // Are we compressable? if (client.IsCompressable()) { if (compressed) { AddBoolean(rawData.Length > 100); if (rawData.Length > 100) { rawData = client.Compress(rawData); } } } // Are we encrypted? if (client.IsEncrypted()) { // Encrypt the SOE Packet rawData = client.Encrypt(rawData); } // Add the raw data AddBytes(rawData); // Appended CRC32? if (appendCRC) { AddBytes(client.GetAppendedCRC32(GetRaw())); } // Set our new packet newPacket = GetRaw(); // Get our old message before compression/encryption Data = new List<byte>(originalPacket); // If we are a message, set our OpCode back if (IsMessage) { // Set our OpCode back too.. OpCode = originalOpCode; } // Return the compressed/encrypted packet return new SOEPacket(OpCode, newPacket); }