Форум Pawn.Wiki - Воплоти мечту в реальность!: Simple Dialog - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Simple Dialog Оценка: -----

#1
Пользователь офлайн   VVWVV 

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

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

Скачать
Посмотреть на Pastebin

Зависимости
Для работы реализации нужны: модифицированный компилятор, стандартная библиотека SA-MP и сервер 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");
}


Сообщение отредактировал VVWVV: 10 августа 2022 - 14:48

3

#2
Пользователь офлайн   Saibot 

  • Местный
  • Вставить ник
  • Раскрыть информацию
А создать диалог по типу Dialog_Create, есть возможность?
0

#3
Пользователь офлайн   VVWVV 

  • ?
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSaibot (10 августа 2022 - 14:48) писал:

А создать диалог по типу Dialog_Create, есть возможность?

Нет, но могу добавить, если будет необходимость. Какая необходимость в Dialog_Create? Что должна делать данная функция?
0

#4
Пользователь офлайн   Saibot 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Вот пример m_dialoga от ziggi

//Создаем
DialogCreate:name_dialog(playerid)
{
	Dialog_Open(playerid, Dialog: name_dialog,
		0,
		"",
		"",
		!"",
		!""
	);
	return 1;
}

Dialog_Show(playerid, "name_dialog"); //Показываем


DialogResponse:name_dialog(playerid, response, listitem, inputtext[])
{
	//используем
}

0

#5
Пользователь офлайн   VVWVV 

  • ?
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSaibot (10 августа 2022 - 14:56) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


По моему мнению, данная фича - это overengineering, который не нужен такой простой библиотеке. Ко всему прочему, таким образом мы ограничиваем разработчика в использовании аргументов, которые он мог бы использовать, если бы у него была своя функция, которая формирует диалог. Ему будет необходимо использовать глобальные переменные. Кейсы, когда нам нужен только playerid довольные редко можно встретить.
0

#6
Пользователь офлайн   Saibot 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Если разработчику понадобится передать больше аргументов, то он создаст для этого функцию, а если нужно передать только playerid, то можно воспользоваться этим.
Но, это твоя система, тебе виднее.
0

#7
Пользователь офлайн   Nexius 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Единственное, что не особо понятно, tdw_dialog уже был - почему бы просто не переписать его вместо новых релизов примерно того же по функционалу?
0

#8
Пользователь офлайн   continue 

  • Знаток
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (10 августа 2022 - 15:17) писал:

Единственное, что не особо понятно, tdw_dialog уже был - почему бы просто не переписать его вместо новых релизов примерно того же по функционалу?


Он ещё в году 17-18 потерял доступ к аккаунту на github и нет доступа к tdw_org, вероятно он не хочет делать форки от своего же аккаунта

Сообщение отредактировал continue: 10 августа 2022 - 15:25

0

#9
Пользователь офлайн   VVWVV 

  • ?
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (10 августа 2022 - 15:17) писал:

Единственное, что не особо понятно, tdw_dialog уже был - почему бы просто не переписать его вместо новых релизов примерно того же по функционалу?


Я не поддерживаю больше TDW-библиотеки. Кроме того, данная библиотека не имеет того функционала, который имеет tdw_dialog. Тем не менее, реализация simple dialogs намного эффективнее всех других аналогов. Мажорное отличие API от tdw_dialog (и других аналогов) - не нужно передавать название обработчика в виде строки.
0

#10
Пользователь офлайн   continue 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Что на счет валидности ввода текста в диалог?

https://github.com/N...ex-ac.inc#L4154

P.S: Весь прикол tdw_dialog, в отличии от других был в том, что можно было пропускать аргументы и это удачно использовал я и ещё пару людей на этом форуме. Если ты придумаешь, как в новую библиотеку завезти этот функционал, то будет вообще круто
1

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика