Просмотр полной версии : SF | Проблема с отправкой RPC
Хаюшки, тут возникла необходимость работы с 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
)
;
можете сказать, в чем проблема
его эмулировать нужно, а не отправлять
Другое - SAMPFUNCS | API C++ (https://www.blast.hk/threads/6498/post-144483)
Попробуй другой шрифт.
www.blast.hk
1. Есть в SF встроенная функция, так что все это не надо
SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );
Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3.
sizeof
возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью
strlen( text )
4. Тебе надо эмулировать rpc, а не отправлять его
SF->getRakNet()->emulateRecvRPC
.
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
В данном случае size - это массив char, поэтому sizeof вернет его размер = 6
да, но это только в этом случае.
да, но это только в этом случае.
Какой случай может быть, который под это не подходит?
Какой случай может быть, который под это не подходит?
const char* bar = "hello"
sizeof(bar) вернет 4, либо 8
1. Есть в SF встроенная функция, так что все это не надо
SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );
Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3.
sizeof
возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью
strlen( text )
4. Тебе надо эмулировать rpc, а не отправлять его
SF->getRakNet()->emulateRecvRPC
.
Благодарю за объяснение всех моих ошибок
Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом
Благодарю за объяснение всех моих ошибок
Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом
забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:
bs.Write( text, strlen( text ) );
забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:
bs.Write( text, strlen( text ) );
Это я заметил по примеру, что мне скинули. С чем это вообще связано, можно спросить. Почему просто не текст отправить ведь размер я передал еще в прошлом действии
Это я заметил по примеру, что мне скинули. С чем это вообще связано, можно спросить. Почему просто не текст отправить ведь размер я передал еще в прошлом действии
в прошлом действие ты вписал для клиента (сампа), чтобы он знал сколько байт считывать с битстрима, а сейчас ты просто указываешь сколько байт надо записать в битстрим.
в прошлом действие ты вписал для клиента (сампа), чтобы он знал сколько байт считывать с битстрима, а сейчас ты просто указываешь сколько байт надо записать в битстрим.
Можешь кратко объяснить, В каких случаях нужно указывать это?
Dark_Knight
05.04.2021, 21:29
1. cstring нахер, используй std::string.
2. Правильно как сказали выше надо использовать strlen.
3. Лично я бы записывал текст в ARGB формате, а не в RGb, чтобы параметр альфа не был нулем
https://forum.antichat.xyz/attachments/27707612/
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
(
)
)
;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot