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

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

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

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

Share this post


Link to post
Guest
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

    • Kutuzov
      By Kutuzov
      Всем привет, хотелось бы спросить у тех, кто разбирается в PluginSDK.
      Какие есть источники, руководства, документации о PluginSDK?
      Я пока что ничего нормального не нахожу.
      Заранее спасибо