bool YEncIsCritical(char c)
{
return !c || c == 0x3D || c == 0xA || c == 0xD || c == 0x7F || c == 0x5C || c == 0x25 || c == 0x92 || c == 0x22 || c == 0x3B;
}
int Com_EncodeYEnc(char *indata, int inlen, char *outdata, int outlen)
{
int len = 0;
for (int in = 0; in < inlen; ++in)
{
char c = indata[in] + 0x2A;
if (YEncIsCritical(c))
{
c += 0x40;
if (len + 1 == outlen)
{
*outdata = 0;
return 0;
}
outdata[len++] = 0x3D;
}
if (len + 1 == outlen)
{
*outdata = 0;
return 0;
}
outdata[len++] = c;
}
outdata[len] = 0;
return len;
}
int Com_DecodeYEnc(const char *indata, char *outdata, int outlen)
{
bool escape = false;
int len = 0;
while (*indata)
{
char c = *indata;
if (escape || c != 0x3D)
{
if (len == outlen)
return 0;
if (escape)
{
c -= 0x40;
escape = false;
}
outdata[len++] = c - 0x2A;
}
else
escape = true;
++indata;
}
return len;
}
void SetClientStats(int clientNum, bool statsModified, char *statData)
{
char encodedData[0x400];
encodedBuffer[0] = 0x79;
Com_EncodeYEnc(statData, 0x400, &encodedData[1], 0x400);
SV_GameSendServerCommand(clientNum, 1, va("e %d %s", statsModified, encodedData));
}