30 changes: 30 additions & 0 deletions code/shared/state/RlMessageBuffer.h
Expand Up @@ -4,6 +4,9 @@ namespace rl
{
class MessageBuffer
{
private:
static bool GetLengthHackState();

public:
inline MessageBuffer()
: m_curBit(0), m_maxBit(0)
Expand Down Expand Up @@ -31,6 +34,11 @@ class MessageBuffer

inline bool ReadBitsSingle(void* out, int length)
{
if (length == 13 && GetLengthHackState())
{
length = 16;
}

int startIdx = m_curBit / 8;
int shift = m_curBit % 8;

Expand Down Expand Up @@ -77,6 +85,11 @@ class MessageBuffer

inline std::vector<uint8_t> ReadBits(int length)
{
if (length == 13 && GetLengthHackState())
{
length = 16;
}

std::vector<uint8_t> retVal((length / 8) + ((length % 8 != 0) ? 1 : 0));

ReadBits(retVal.data(), length);
Expand All @@ -86,6 +99,11 @@ class MessageBuffer

inline void ReadBits(void* data, int length)
{
if (length == 13 && GetLengthHackState())
{
length = 16;
}

auto byteData = (uint8_t*)data;

for (int i = 0; i < length; i++)
Expand Down Expand Up @@ -121,6 +139,11 @@ class MessageBuffer

inline void WriteBitsOld(const void* data, int length)
{
if (length == 13)
{
length = 16;
}

auto byteData = (const uint8_t*)data;

for (int i = 0; i < length; i++)
Expand All @@ -135,6 +158,8 @@ class MessageBuffer
// copied IDA code, please improve!
inline bool WriteBits(const void* data, int length)
{
// don't 16ify any 13 here, it might be real data

auto result = (long long)m_data.data();
auto a2 = data;
auto a3 = length;
Expand Down Expand Up @@ -319,6 +344,11 @@ class MessageBuffer
// copied IDA code, eh
inline bool WriteBitsSingle(const void* data, int length)
{
if (length == 13 && GetLengthHackState())
{
length = 16;
}

auto a1 = m_data.data();
auto a2 = *(uint32_t*)data;
auto a3 = length;
Expand Down