Вопросы

в чём может быть проблема? Передаю строку через 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;
};

 

Отредактировано пользователем .037

Поделиться сообщением


Ссылка на сообщение

2 ответа на этот вопрос

  • 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 )

Отредактировано пользователем legendabrn

Поделиться сообщением


Ссылка на сообщение
  • 0

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

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

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

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • sergeenko
      От sergeenko
      Как добавить на сервер новое авто (не заменяя старый)?
      В самом корне игры я всё настроил,
      мне нужно в самом моде настроить.

      Помогите пожалуйста :0