From a1ff12d9abdc6f358c4d35122d1680968c82b5f8 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 22 Jul 2017 14:18:30 -0700 Subject: [PATCH] Fix for unreliable packets not being processed or sent correctly --- common/net/daybreak_connection.cpp | 43 +++++++++++++++--------------- common/net/eqstream.cpp | 7 ++++- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 283f8f93d..095fab525 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -382,13 +382,8 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p) return; } - if (p.GetInt8(0) != 0) { - LogF(Logs::Detail, Logs::Netcode, "Error parsing packet, did not start with a 0 frame, not a valid protocol packet."); - return; - } - auto opcode = p.GetInt8(1); - if (opcode == OP_KeepAlive || opcode == OP_OutboundPing) { + if (p.GetInt8(0) == 0 && (opcode == OP_KeepAlive || opcode == OP_OutboundPing)) { return; } @@ -407,10 +402,16 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p) for (int i = 1; i >= 0; --i) { switch (m_encode_passes[i]) { case EncodeCompression: - Decompress(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + if(temp.GetInt8(0) == 0) + Decompress(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + else + Decompress(temp, 1, temp.Length() - 1); break; case EncodeXOR: - Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + if (temp.GetInt8(0) == 0) + Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + else + Decode(temp, 1, temp.Length() - 1); break; default: break; @@ -425,7 +426,10 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p) for (int i = 1; i >= 0; --i) { switch (m_encode_passes[i]) { case EncodeXOR: - Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + if (temp.GetInt8(0) == 0) + Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size()); + else + Decode(temp, 1, temp.Length() - 1); break; default: break; @@ -1187,24 +1191,21 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p) if (PacketCanBeEncoded(p)) { DynamicPacket out; - - if (p.GetUInt8(0) != 0) { - out.PutUInt8(0, 0); - out.PutUInt8(1, OP_Combined); - out.PutUInt8(2, p.Length()); - out.PutPacket(3, p); - } - else { - out.PutPacket(0, p); - } + out.PutPacket(0, p); for (int i = 0; i < 2; ++i) { switch (m_encode_passes[i]) { case EncodeCompression: - Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size()); + if(out.GetInt8(0) == 0) + Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size()); + else + Compress(out, 1, out.Length() - 1); break; case EncodeXOR: - Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size()); + if (out.GetInt8(0) == 0) + Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size()); + else + Encode(out, 1, out.Length() - 1); break; default: break; diff --git a/common/net/eqstream.cpp b/common/net/eqstream.cpp index 26fdf1d8e..ffa441939 100644 --- a/common/net/eqstream.cpp +++ b/common/net/eqstream.cpp @@ -81,7 +81,12 @@ void EQ::Net::EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req) break; } - m_connection->QueuePacket(out); + if (ack_req) { + m_connection->QueuePacket(out); + } + else { + m_connection->QueuePacket(out, 0, false); + } } }