diff --git a/src/game/desc.cpp b/src/game/desc.cpp index 6cdf37c..f207b44 100644 --- a/src/game/desc.cpp +++ b/src/game/desc.cpp @@ -78,6 +78,8 @@ void DESC::Initialize() m_bChannelStatusRequested = false; m_SequenceGenerator.seed(SEQUENCE_SEED); + // Pre-generate the first expected sequence to match what client will send + m_bNextExpectedSequence = m_SequenceGenerator(UINT8_MAX + 1); m_pkLoginKey = NULL; m_dwLoginKey = 0; @@ -920,7 +922,10 @@ bool DESC::IsAdminMode() BYTE DESC::GetSequence() { - return m_SequenceGenerator(UINT8_MAX + 1); + // Return the next expected sequence and then generate the one after that + BYTE bCurrentExpected = m_bNextExpectedSequence; + m_bNextExpectedSequence = m_SequenceGenerator(UINT8_MAX + 1); + return bCurrentExpected; } void DESC::SendLoginSuccessPacket() diff --git a/src/game/desc.h b/src/game/desc.h index b654202..0230599 100644 --- a/src/game/desc.h +++ b/src/game/desc.h @@ -230,6 +230,7 @@ class DESC bool m_bPong; pcg32 m_SequenceGenerator; + BYTE m_bNextExpectedSequence; // Next expected sequence number from client CLoginKey * m_pkLoginKey; DWORD m_dwLoginKey;