ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   RPD_DialogResponse (https://forum.antichat.xyz/showthread.php?t=1443498)

Unknown_251 02.08.2022 14:47

Суть такова:

С помощью SF плагина выводится диалог игроку. И естественно ставится функция обработчик этого диалога.

Вопрос в следующем. Как отправить введенные данные игроком на сервер, чтобы сработал паблик OnDialogResponce.

Пробовал с помощью RPD_DialogResponse. Данные в BitStream записывал в следующем порядке:

- dialogId (2 байта)

- button (1 байт)

- listItem (2 байта)

- textLen (1 байт)

- text (textLen байт)

Если вдруг понадобятся:

- версия SAMP 0.3.7 R3-1

- версия sampfuncs 5.5.1

sc6ut 02.08.2022 15:36

C++:





Код:

void
send_dialog_responce
(
std
::
uint16_t
id
,
std
::
uint8_t
responce
,
std
::
uint16_t
list_item
,
const
char
*
text
)
{
BitStream bs
;
bs
.
Write
(
id
)
;
bs
.
Write
(
responce
)
;
bs
.
Write
(
list_item
)
;
bs
.
Write
(
static_cast

(
std
::
strlen
(
text
)
)
)
;
bs
.
Write
(
text
,
std
::
strlen
(
text
)
)
;
SF
->
getRakNet
(
)
->
SendRPC
(
RPC_DialogResponse
,
&
bs
)
;
}


Unknown_251 02.08.2022 21:25

Объясни это:

bs.Write(static_cast(std::strlen(text)));

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

Почему два раза была записана длина текста в BitStream. Или во втором случае нужно указать сколько именно символов текста нужно записать?

В остальном спасибо.

Цитата:

Сообщение от sc6ut

C++:





Код:

void
send_dialog_responce
(
std
::
uint16_t
id
,
std
::
uint8_t
responce
,
std
::
uint16_t
list_item
,
const
char
*
text
)
{
BitStream bs
;
bs
.
Write
(
id
)
;
bs
.
Write
(
responce
)
;
bs
.
Write
(
list_item
)
;
bs
.
Write
(
static_cast

(
std
::
strlen
(
text
)
)
)
;
bs
.
Write
(
text
,
std
::
strlen
(
text
)
)
;
SF
->
getRakNet
(
)
->
SendRPC
(
RPC_DialogResponse
,
&
bs
)
;
}



Что то не хочет сервер (OnDialogResponse) обрабатывать такой запрос. Что опять не так?

Yuriy Code 05.08.2022 10:40

Цитата:

Сообщение от sc6ut

C++:





Код:

void
send_dialog_responce
(
std
::
uint16_t
id
,
std
::
uint8_t
responce
,
std
::
uint16_t
list_item
,
const
char
*
text
)
{
BitStream bs
;
bs
.
Write
(
id
)
;
bs
.
Write
(
responce
)
;
bs
.
Write
(
list_item
)
;
bs
.
Write
(
static_cast

(
std
::
strlen
(
text
)
)
)
;
bs
.
Write
(
text
,
std
::
strlen
(
text
)
)
;
SF
->
getRakNet
(
)
->
SendRPC
(
RPC_DialogResponse
,
&
bs
)
;
}



Не проще ли сделать следующим образом?

C++:





Код:

SF
->
getSAMP
(
)
->
sendDialogResponse
(
ид
,
кнопка
,
листитем
,
текст
)
;


Unknown_251 14.08.2022 14:01

Цитата:

Сообщение от Yuriy Code

Не проще ли сделать следующим образом?

C++:





Код:

SF
->
getSAMP
(
)
->
sendDialogResponse
(
ид
,
кнопка
,
листитем
,
текст
)
;



А чет так можно было что ли?

UPD: спс, я просто тупо не посмотрел весь список функций модуля SAMP.

kin4stat 25.08.2022 17:07

Вообще, сам самп имеет параметр BOOL server_side при создании диалога. Отвечает за то, будет ли отправлен ответ серверу при действии игрока. Сф такой параметр не имеет чтоль?

Dark_Knight 27.08.2022 01:03

Цитата:

Сообщение от kin4stat

Вообще, сам самп имеет параметр BOOL server_side при создании диалога. Отвечает за то, будет ли отправлен ответ серверу при действии игрока. Сф такой параметр не имеет чтоль?

Вроде клиент сайт никогда такого не имел.


Время: 07:56