Pawn.Raknet и его не раскрытые возможности.
#4

Структура исходящей синхры очень отличается от входящей. Точнее она не статическая, а записывается динамически (похоже в целях экономии трафика).

На 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;
	}
}
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)