03.08.2018, 20:31
Структура исходящей синхры очень отличается от входящей. Точнее она не статическая, а записывается динамически (похоже в целях экономии трафика).
На 0.3e разбирался с этим и написал такую фн, но я не уверен, что она подойдет для 0.3.7:
На 0.3e разбирался с этим и написал такую фн, но я не уверен, что она подойдет для 0.3.7:
Code:
void decodeHealthArmour(unsigned char byteHealthArmour, unsigned char& byteHealth, unsigned char& byteArmour)
{
unsigned char byteArmTemp = 0;
unsigned char byteHlTemp = 0;
byteArmTemp = (byteHealthArmour & 0x0F);
byteHlTemp = (byteHealthArmour >> 4);
if (byteArmTemp == 0xF) {
byteArmour = 100;
}
else if (byteArmTemp == 0) {
byteArmour = 0;
}
else {
byteArmour = byteArmTemp * 7;
}
if (byteHlTemp == 0xF) {
byteHealth = 100;
}
else if (byteHlTemp == 0) {
byteHealth = 0;
}
else {
byteHealth = byteHlTemp * 7;
}
}
void decodePlayerSync(BitStream* bsRead, stOnFootData* data)
{
bool bLeftRightKeys = false;
bool bUpDownKeys = false;
unsigned char byteHealthArmour = 0;
unsigned char byteCurrentWeapon = 0;
unsigned char byteAdditionalKey = 0;
unsigned char byteSpecialAction = 0;
bool bSurfing = false;
bool bAnimationID = false;
bsRead->Read(bLeftRightKeys);
if (bLeftRightKeys) {
bsRead->Read(data->sLeftRightKeys);
}
else {
data->sLeftRightKeys = 0;
}
bsRead->Read(bUpDownKeys);
if (bUpDownKeys) {
bsRead->Read(data->sUpDownKeys);
}
else {
data->sUpDownKeys = 0;
}
bsRead->Read(data->sKeys);
bsRead->Read(data->fPosition[0]);
bsRead->Read(data->fPosition[1]);
bsRead->Read(data->fPosition[2]);
bsRead->ReadNormQuat(data->fQuaternion[0], data->fQuaternion[1], data->fQuaternion[2], data->fQuaternion[3]);
bsRead->Read(byteHealthArmour);
bsRead->ReadBits(&byteAdditionalKey, 2);
bsRead->ReadBits(&byteCurrentWeapon, 6);
bsRead->Read(byteSpecialAction);
bsRead->ReadVector(data->fMoveSpeed[0], data->fMoveSpeed[1], data->fMoveSpeed[2]);
decodeHealthArmour(byteHealthArmour, data->byteHealth, data->byteArmor);
data->byteCurrentWeapon = byteCurrentWeapon;
data->byteAdditionalKey = byteAdditionalKey;
data->byteSpecialAction = byteSpecialAction;
bsRead->Read(bSurfing);
if (bSurfing) {
bsRead->Read(data->sSurfingID);
bsRead->Read(data->fSurfingOffsets[0]);
bsRead->Read(data->fSurfingOffsets[1]);
bsRead->Read(data->fSurfingOffsets[2]);
}
else {
data->sSurfingID = 0xFFFF;
data->fSurfingOffsets[0] = 0.0;
data->fSurfingOffsets[1] = 0.0;
data->fSurfingOffsets[2] = 0.0;
}
bsRead->Read(bAnimationID);
if (bAnimationID) {
bsRead->Read(data->sCurrentAnimationID);
bsRead->Read(data->sCurrentAnimationFlags);
}
else {
data->sCurrentAnimationID = 0;
data->sCurrentAnimationFlags = 0;
}
}

