Question

Освоившийся

в чём может быть проблема? Передаю строку через PR_String, и получаю с клиента бред

CMD:TestData(playerid, params[]){

    new msg[] = "Code_Test";

	new BitStream:bs = BS_New();

    BS_WriteInt8(bs,30);
    BS_WriteFloat(bs,0.9);
    BS_WriteFloat(bs,23.4);
    BS_WriteString(bs, msg, sizeof msg);

	PR_SendRPC(bs, playerid, 179);

	BS_Delete(bs);
	return 1;
}

[05:57:27] RPC - Длина  30 | 0.900000 | 23.400000 | I*(!@dp
И всегда текст разный :S

Хотя принимаю всё нормально:

 

bool CALLBACK Hok_RPC_BYTE(stRakNetHookParams *params)
{
	if (params->packetId == 179) 
	{
		SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Кастомный RPC работает!!!");
		byte nameLen;
		float test;
		float test1;
		char szPlayerName[100];
		params->bitStream->ResetReadPointer();
		params->bitStream->Read(nameLen); 
		params->bitStream->Read(test);
		params->bitStream->Read(test1);
        params->bitStream->Read(szPlayerName, 100);
		params->bitStream->ResetReadPointer(); 
		SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "RPC - Длина  %d | %f | %f | %s", nameLen, test , test1, szPlayerName);
	}
	return true;
};

 

Edited by .037

Share this post


Link to post

2 answers to this question

  • 0
Активный

Ну во первых используй strlen вместо sizeof. ( в данном случае )

strlen() используется для получения длины строки, хранящейся в массиве.

sizeof() используется для получения фактического размера.

Во вторых ты должен предварительно записать длину строки.

Твой код должен будет выглядеть так:

CMD:TestData(playerid, params[])
{
    new msg[] = "Code_Test";
	new BitStream:bs = BS_New();

    BS_WriteFloat(bs,0.9);
    BS_WriteFloat(bs,23.4);
    BS_WriteUint8(bs, strlen(msg));
    BS_WriteString(bs, msg);

	PR_SendRPC(bs, playerid, 179);
	BS_Delete(bs);
	return 1;
}

Клиентская сторона будет выглядеть так:

bool CALLBACK Hok_RPC_BYTE(stRakNetHookParams *params)
{
	if (params->packetId == 179) 
	{
		SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Кастомный RPC работает!!!");
		float test, test1;
		std::string szPlayerName;
		uint8_t len;
		params->bitStream->ResetReadPointer();
		params->bitStream->Read(test);
		params->bitStream->Read(test1);
        params->bitStream->Read(len);
        text.reserve(len);
        params->bitStream->Read(const_cast<char*>(szPlayerName.data()), len);
		params->bitStream->ResetReadPointer(); 
		SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "RPC - Длина  %f | %f | %s | %d", test , test1, szPlayerName.c_str(), len);
	}
	return true;
};

В третьих, дефайн BS_WriteString принимает два аргумента ( line github pawn.raknet )

Edited by legendabrn

Share this post


Link to post
  • 0
DEST
Maintainer

Залогируйте еще какое значение возвращает функция Read для строки, оно должно быть true. 

Также попробуйте воспользоваться методом PrintHex(char*) для просмотра всего битстрима, который пришел. 

Чтобы лишние значения не мешали (30, 0,9 ...) можно их пока убрать. 

Share this post


Link to post
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By DonK/Key
      Всем привет, помогите кто разбирается, так как я можно сказать начинающий сделать свой КРМП, буду благодарен. Напишите либо тут либо @evreI_sigma (Мой Telegram)