PDA

Просмотр полной версии : [Include] Simple Dialog



VVWVV
10.08.2022, 13:33
Мотивация
Все текущие реализации довольно медленные. Во-первых, все они используют функцию SA-MP `CallLocalFunction`, которая сама по себе медленная O(log N) и имеет множество багов, вызывающих краш сервера. Во-вторых, нет возможности проверки имени во время компиляции. В-третьих, все из них хранят названия функций обратного вызова для каждого игрока, что составляет 1000 (MAX_PLAYERS) на 32 байта (максимальный размер имени функции).

Решение
В Pawn есть автоматы, которые решают все проблемы прошлых реализаций, связанных с поиском, проверкой имени функции и их хранением. Нам лишь нужно хранить состояние для каждого игрока. С помощью автоматов нам не нужно искать обработчик по названию O(1), а нужно лишь хранить индекс (4 байта) на 1000 (MAX_PLAYERS).

Скачать
Посмотреть на Pastebin (https://pastebin.com/xQHjfj7t)

Зависимости
Для работы реализации нужны: модифицированный компилятор (https://github.com/pawn-lang/compiler), стандартная библиотека SA-MP (https://github.com/pawn-lang/samp-stdlib) и сервер SA-MP.

Пример

DIALOG:PlayerSignUp(playerid, response, listitem, const inputtext[]) {
if (!response)
return;
// ...
}


public OnGameModeInit() {
Dialog_Init();
}


public OnPlayerConnect(playerid) {
Dialog_Show(playerid, PlayerSignUp, DIALOG_STYLE_MSGBOX, !"Sign Up", !"You are new", !"Start", !"Cancel");
}

Leogin
10.08.2022, 15:33
Сделай еще чтобы через макрос можно было вкл/выкл уникального ида в диалог, это для клиента нужно, есть некоторые клиенты, которые запоминают выбранну строку в диалоге, что игрок ввел..

VVWVV
10.08.2022, 15:57
Сделай еще чтобы через макрос можно было вкл/выкл уникального ида в диалог, это для клиента нужно, есть некоторые клиенты, которые запоминают выбранну строку в диалоге, что игрок ввел..
Не совсем понимаю, что вы имеете в виду. Можете более развернуто рассказать?

Leogin
10.08.2022, 16:27
Есть аризона, у них в клиенте есть фича для диалогов, там например в меню диалога кликнув на listitem - выбранный пунк сохранятся, например по умолчанию всегда первая строка выделена, а если что-то выбирает игрок, и повторно откроет этот диалог, будет по умолчанию выделенный пункт тот, который игрок выбрал в последний раз.

Пример 1: на 2й пункт (listitem) кликнуть, этот выбор сохранится. Пример 2: на 2м диалоге кликаешь допустим на 3й пункт (listitem). Когда нажимаешь назад, тебе откроется первый диалог (пример 1), там уже будет выбран пункт 2, то есть действия что игрок выбирал в диалоге - они запоминаются. По этому иногда приходится использовать уникальный ид диалога

В этом примере:
1 диалог - сохранил 2й пункт
2 диалог - сохранил 3й пункт

Salik_Davince
10.08.2022, 21:11
Я так понимаю он имеет ввиду использовать свой уникальный ид диалогов, вместо макроса - DIALOG_ID, действительно, у меня так же, при показе диалога, выбранный лист сбрасывается, ввиду одинакового ида диалога.

- - - Добавлено - - -