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; } }