SF | Проблема с отправкой RPC

ANZR

Известный
Автор темы
168
104
Хаюшки, тут возникла необходимость работы с bitstream
Вот например, хочу я отправить в чат сообщение(не от моего лица, а в виде серверного), не через функцию отправки сообщения, а напрямую через RPC
Вроде сделал так, как надо, но текста в чате нету

с++:
    char text[] = "hello";
    BitStream bsActorSync; 
    bsActorSync.Write((UINT32)0xFFFFFF);
    bsActorSync.Write((UINT32)sizeof(text));
    bsActorSync.Write(text);
    SF->getRakNet()->SendRPC(RPC_ScrClientMessage, &bsActorSync);
можете сказать, в чем проблема
 

sc6ut

неизвестный
Модератор
382
1,075
1. Есть в SF встроенная функция, так что все это не надо SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );
Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3. sizeof возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью strlen( text )
4. Тебе надо эмулировать rpc, а не отправлять его SF->getRakNet()->emulateRecvRPC.
 
  • Нравится
Реакции: ANZR

sᴀxᴏɴ

#Mary
Всефорумный модератор
791
846
1. Есть в SF встроенная функция, так что все это не надо SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );
Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3. sizeof возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью strlen( text )
4. Тебе надо эмулировать rpc, а не отправлять его SF->getRakNet()->emulateRecvRPC.
В данном случае size - это массив char, поэтому sizeof вернет его размер = 6
 
  • Нравится
Реакции: sc6ut

ANZR

Известный
Автор темы
168
104
1. Есть в SF встроенная функция, так что все это не надо SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );
Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3. sizeof возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью strlen( text )
4. Тебе надо эмулировать rpc, а не отправлять его SF->getRakNet()->emulateRecvRPC.
Благодарю за объяснение всех моих ошибок
Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом
 

sc6ut

неизвестный
Модератор
382
1,075
Благодарю за объяснение всех моих ошибок
Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом
забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:
bs.Write( text, strlen( text ) );
 

ANZR

Известный
Автор темы
168
104
забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:
bs.Write( text, strlen( text ) );
Это я заметил по примеру, что мне скинули. С чем это вообще связано, можно спросить. Почему просто не текст отправить ведь размер я передал еще в прошлом действии
 

sc6ut

неизвестный
Модератор
382
1,075
Это я заметил по примеру, что мне скинули. С чем это вообще связано, можно спросить. Почему просто не текст отправить ведь размер я передал еще в прошлом действии
в прошлом действие ты вписал для клиента (сампа), чтобы он знал сколько байт считывать с битстрима, а сейчас ты просто указываешь сколько байт надо записать в битстрим.
 

ANZR

Известный
Автор темы
168
104
в прошлом действие ты вписал для клиента (сампа), чтобы он знал сколько байт считывать с битстрима, а сейчас ты просто указываешь сколько байт надо записать в битстрим.
Можешь кратко объяснить, В каких случаях нужно указывать это?
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
1. cstring нахер, используй std::string.
2. Правильно как сказали выше надо использовать strlen.
3. Лично я бы записывал текст в ARGB формате, а не в RGb, чтобы параметр альфа не был нулем
1617644001767.png
C++:
char text[] = "hello";
BitStream bsActorSync;
bsActorSync.Write((UINT32)0xFFFFFF);
bsActorSync.Write((UINT32)strlen(text));
bsActorSync.Write(text, strlen(text)); //Указываем длину текста для того, чтобы не записался лишний мусор.
//пример с std::string
std::string text = "hello";
BitStream bsActorSync;
bsActorSync.Write((UINT32)0xFFFFFF);
bsActorSync.Write(text.length());
bsActorSync.Write(text.c_str(), text.length());
 
Последнее редактирование:
  • Нравится
Реакции: sc6ut

Похожие темы

  1. Ответы
    86
    Просмотры
    25K
  2. Ответы
    83K
    Просмотры
    7M
  3. D
    Ответы
    12
    Просмотры
    571
    Вопросы
    deleted-user-532248
    D