PDA

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


ANZR
05.04.2021, 00:57
Хаюшки, тут возникла необходимость работы с 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
)
;




можете сказать, в чем проблема

Romelo
05.04.2021, 01:05
его эмулировать нужно, а не отправлять

Другое - SAMPFUNCS | API C++ (https://www.blast.hk/threads/6498/post-144483)

Попробуй другой шрифт.

www.blast.hk

sc6ut
05.04.2021, 01:06
1. Есть в SF встроенная функция, так что все это не надо

SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );


Но всё же.

2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.

3.

sizeof

возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью

strlen( text )


4. Тебе надо эмулировать rpc, а не отправлять его

SF->getRakNet()->emulateRecvRPC

.

sᴀxᴏɴ
05.04.2021, 01:10
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
05.04.2021, 01:11
В данном случае size - это массив char, поэтому sizeof вернет его размер = 6


да, но это только в этом случае.

ANZR
05.04.2021, 01:15
да, но это только в этом случае.


Какой случай может быть, который под это не подходит?

sᴀxᴏɴ
05.04.2021, 01:15
Какой случай может быть, который под это не подходит?




const char* bar = "hello"


sizeof(bar) вернет 4, либо 8

ANZR
05.04.2021, 01:16
1. Есть в SF встроенная функция, так что все это не надо

SF->getSAMP()->getChat()->AddChatMessage( -1, "text" );


Но всё же.
2. В отличие от битстрима пакета, в начале битстрима rpc нет айди rpc, поэтому его записывать не надо.
3.

sizeof

возвращает размер переменной, а не длинну текст, в твоём случае это будет 4 байта, то есть размер любого указателя. Вместо него тебе надо записать длинну текста, к примеру, с помощью

strlen( text )


4. Тебе надо эмулировать rpc, а не отправлять его

SF->getRakNet()->emulateRecvRPC

.


Благодарю за объяснение всех моих ошибок

Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом

sc6ut
05.04.2021, 01:20
Благодарю за объяснение всех моих ошибок
Кстати, по поводу AddChatMessage я знаю и сказал еще вначале, что мне нужно это сделать через bitStream, т.к у меня есть очень интересная идея, а это лишь один шаг для ее реализации, т.к я работать буду не только с текстом


забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:


bs.Write( text, strlen( text ) );

ANZR
05.04.2021, 01:25
забыл еще сказать: текст надо записывать в битстрим вместе с его размером, так:


bs.Write( text, strlen( text ) );



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

sc6ut
05.04.2021, 01:28
Это я заметил по примеру, что мне скинули. С чем это вообще связано, можно спросить. Почему просто не текст отправить ведь размер я передал еще в прошлом действии


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

ANZR
05.04.2021, 01:40
в прошлом действие ты вписал для клиента (сампа), чтобы он знал сколько байт считывать с битстрима, а сейчас ты просто указываешь сколько байт надо записать в битстрим.


Можешь кратко объяснить, В каких случаях нужно указывать это?

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
(
)
)
;