Мотивация
Все текущие реализации довольно медленные. Во-первых, все они используют функцию 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; // ... } Dialog_Init(); } Dialog_Show(playerid, PlayerSignUp, DIALOG_STYLE_MSGBOX, !"Sign Up", !"You are new", !"Start", !"Cancel"); }