Информация Гайд Создание локальных диалогов

Статус
В этой теме нельзя размещать новые ответы.

itsLegend

Фонд борьбы за жуков 🐞
Автор темы
Администратор
2,696
1,468
С версии SAMPFUNCS 2.0 можно создавать локальные SAMP диалоги.
Слово "локальные" наверно всем понятно, для тех кто в танке: "появляется только у Вас и никак не появляет на сервер".

Диалог может быть:
  1. С текстом;
  2. Со списком;
  3. С полем для ввода текста, а также можно и скрывать "введенное" в это поле точками;
  4. Список с несколькими колонками;
  5. Список с несколькими колонками и их заголовками.
Сейчас мы рассмотрим все ЧЕТЫРЕ типа диалогов.
В начало кода(после {$CLEO}) вставить константы(они необязательны, но так становится более понятнее код):
CLEO:
const
    DIALOG_STYLE_MSGBOX = 0 // С текстом
    DIALOG_STYLE_INPUT = 1 // С полем для ввода текста
    DIALOG_STYLE_LIST = 2 // Со списком
    DIALOG_STYLE_PASSWORD = 3 // С полем для ввода текста, текст заменяется точками
    DIALOG_STYLE_TABLIST = 4 // Похож на DIALOG_STYLE_LIST, но может быть разбит на несколько колонок
    DIALOG_STYLE_TABLIST_HEADERS = 5 // Тот же, что и DIALOG_STYLE_TABLIST, но имеет заголовки для колонок
end

Тип диалога: DIALOG_STYLE_MSGBOX
(с текстом, без особенностей)
Создадим локальный диалог с помощью кнопки B(англ.), без обработки его "отправляемых" данных(для этого используется опкод 0B3B):
CLEO:
0B3B: samp show_dialog id 45 caption "Первый диалог" text "{ffffff}Хей хей хей! Это же {ff0000}первый {ffffff}диалог!" button_1 "Уря" button_2 "Закрыть" style DIALOG_STYLE_MSGBOX
// ; Локальный диалог с идом 45 был создан.

Нам недостаточно просто создать его, то сделаем обработчик "отправляемых" данных:
CLEO:
if 0B3C: samp is_dialog_responded id 45 button 1@ list_item 0 input_text 0 // Логгируем нажатие кнопки диалога с идом 45
then
    if 1@ == 1 // Была нажата первая кнопка
    then 0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
    else
        // Иначе второй кнопкой или же просто закрыт(esc'ом, например) / 1@ == 0
        0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
    end
end



Тип диалога: DIALOG_STYLE_INPUT
(с вводом для текста)
Создадим локальный диалог с помощью кнопки B(англ.), без обработки его "отправляемых" данных(для этого используется опкод 0B3B):
CLEO:
0B3B: samp show_dialog id 46 caption "Второй диалог" text "А ниже поле для ввода" button_1 "Закрыть" button_2 "Уря" style DIALOG_STYLE_INPUT
// ; Локальный диалог с идом 46 был создан.

Сделаем обработчик "отправляемых" данных для данного типа диалога:
CLEO:
0ac8: alloc 2@ size 64 // Выделим память для хранения введеного текста // здесь неправильно выбрана позиция этого выделения, его лучше вставить после создания
// и очистить после обработки
if 0B3C: samp is_dialog_responded id 46 button 1@ list_item 0 input_text 2@ // Логгируем нажатие кнопки диалога и введеного текста с идом 46
then
    if 1@ == 1 // Была нажата первая кнопка
    then
0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
0af8: chat "Введеный текст: {ffff00}%s" -1 2@
    else
        // Иначе второй кнопкой или же просто закрыт(esc'ом, например) / 1@ == 0
        0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
    end
end
0ac9: free 2@ // Очистим выделенную ранее память, больше необходима // здесь неправильно выбрана позиция этого очищения, причина указана в начале кода



Тип диалога: DIALOG_STYLE_LIST
(с выбором элементов/список)
Создадим локальный диалог с помощью кнопки B(англ.), без обработки его "отправляемых" данных(для этого используется опкод 0B3B):
CLEO:
0ac8: alloc 0@ size 64 // Выделяем память под список элементов(кол-во текста должно быть не больше 64 символов(пробелы и переходы на новую строку тоже равны 1 символу)
0ad3: format_stirng 0@ = "Первый пункт%cВторой пункт%cТретий пункт" 0xA 0xA // Создаем список, 0xA - означает переход на новую строку, а %c указывается в самой строке
// %c = 0xA(их кол-во должно совпадать). %c не всегда предназначается для 0xA, об этом лучше не заморачиваться или прочитать какой-нибудь вики про форматирование строк
0B3B: samp show_dialog id 47 caption "Третий диалог" text 0@ button_1 "Выбрать" button_2 "Закрыть" style DIALOG_STYLE_LIST
// ; Локальный диалог с идом 47 был создан.
0ac9: free 0@ // Освобождаем память, больше не нужна.

Сделаем обработчик "отправляемых" данных для данного типа диалога:
CLEO:
if 0B3C: samp is_dialog_responded id 47 button 1@ list_item 3@ input_text 0 // Логгируем нажатие кнопки диалога и выбранного элемента из списка диалога 47
then
    if 1@ == 1 // Была нажата первая кнопка
    then
          0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
          0af8: chat "Был выбран элемент номер: {ffff00}%d" -1 3@
          if 3@ == 0
          then
                  0af8: chat "Был выбран элемент: {ffff00}Первый пункт" -1
          end

          if 3@ == 1
          then
                  0af8: chat "Был выбран элемент: {ffff00}Второй пункт" -1
          end

          if 3@ == 2
          then
                  0af8: chat "Был выбран элемент: {ffff00}Третий пункт" -1
          end
    else
        // Иначе второй кнопкой или же просто закрыт(esc'ом, например) / 1@ == 0
        0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
    end
end



Тип диалога: DIALOG_STYLE_PASSWORD
(с вводом для текста, текст в поле меняется точками/звездочками)
Создадим локальный диалог с помощью кнопки B(англ.), без обработки его "отправляемых" данных(для этого используется опкод 0B3B):
CLEO:
0B3B: samp show_dialog id 48 caption "Второй диалог" text "А ниже поле для ввода" button_1 "Закрыть" button_2 "Уря" style DIALOG_STYLE_PASSWORD
// ; Локальный диалог с идом 48 был создан.

Сделаем обработчик "отправляемых" данных для данного типа диалога, идентичен с типом DIALOG_STYLE_INPUT:
CLEO:
0ac8: alloc 2@ size 64 // Выделим память для хранения введеного текста // здесь неправильно выбрана позиция этого выделения, его лучше вставить после создания
// и очистить после обработки
if 0B3C: samp is_dialog_responded id 48 button 1@ list_item 0 input_text 2@ // Логгируем нажатие кнопки диалога и введеного текста с идом 46
then
    if 1@ == 1 // Была нажата первая кнопка
    then
0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
0af8: chat "Введеный текст: {ffff00}%s" -1 2@
    else
        // Иначе второй кнопкой или же просто закрыт(esc'ом, например) / 1@ == 0
        0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
    end
end
0ac9: free 2@ // Очистим выделенную ранее память, больше необходима // здесь неправильно выбрана позиция этого очищения, причина указана в начале кода



Тип диалога: DIALOG_STYLE_TABLIST
(список (DIALOG_STYLE_LIST) с колонками)
Для разделения на колонки в каждой строке используется знак табуляции (\t, 0x9), от их количества зависит количество колонок.
Максимум колонок - 4.




Тип диалога: DIALOG_STYLE_TABLIST_HEADERS
(список с именованными колонками (наследуется от DIALOG_STYLE_TABLIST))
Тот же, что и DIALOG_STYLE_TABLIST, но первая строка служит заголовком для списка. Так же может иметь только 4 колонки.



Пример скрипта
(объединены диалоги типов DIALOG_STYLE_MSGBOX/INPUT/LIST/PASSWORD)
CLEO:
{$CLEO}

const
    DIALOG_STYLE_MSGBOX = 0 // С текстом
    DIALOG_STYLE_INPUT = 1 // С полем для ввода текста
    DIALOG_STYLE_LIST = 2 // Со списком
    DIALOG_STYLE_PASSWORD = 3 // С полем для ввода текста, текст заменяется точками
end

0000:
0662: "by legend2360"
0662: "BlastHack - cheating is art"

while not SAMP.Available()
    wait 400
end

0ac8: alloc 2@ size 64 // буфер для хранения введенего текста 

while true
    wait 0
    if 0ab0: key_down 66
    then
        while 0ab0: key_down 66
            wait 0
            if 0ab0: key_down 49
            then
                0B3B: samp show_dialog id 45 caption "Первый диалог" text "{ffffff}Хей хей хей! Это же {ff0000}первый {ffffff}диалог!" button_1 "Уря" button_2 "Закрыть" style DIALOG_STYLE_MSGBOX
                break
            end

            if 0ab0: key_down 50
            then
                0B3B: samp show_dialog id 46 caption "Второй диалог" text "А ниже поле для ввода" button_1 "Уря" button_2 "Закрыть" style DIALOG_STYLE_INPUT
                break
            end

            if 0ab0: key_down 51
            then
                0ac8: alloc 0@ size 64
                0ad3: format_stirng 0@ = "Первый пункт%cВторой пункт%cТретий пункт" 0xA 0xA
                0B3B: samp show_dialog id 47 caption "Третий диалог" text 0@ button_1 "Выбрать" button_2 "Закрыть" style DIALOG_STYLE_LIST
                0ac9: free 0@
                break
            end

            if 0ab0: key_down 52
            then
                0B3B: samp show_dialog id 48 caption "Второй диалог" text "А ниже поле для ввода" button_1 "Уря" button_2 "Закрыть" style DIALOG_STYLE_PASSWORD
                break
            end
        end

        while 0ab0: key_down 66
            wait 0
        end
    end

    // DIALOG_STYLE_MSGBOX
    if 0B3C: samp is_dialog_responded id 45 button 1@ list_item 0 input_text 0
    then
        if 1@ == 1 // Была нажата первая кнопка
        then
            0af8: chat "Диалог был закрыт первой кнопкой: {ffff00}Уря" -1
        else
            0af8: chat "Диалог был закрыт второй кнопкой: {ffff00}Закрыть" -1
        end
    end

    // DIALOG_STYLE_LIST
    if 0B3C: samp is_dialog_responded id 47 button 1@ list_item 3@ input_text 0 // Логгируем нажатие кнопки диалога и выбранного элемента из списка диалога 47
    then
        if 1@ == 1 // Была нажата первая кнопка
        then
            0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
            0af8: chat "Был выбран элемент номер: {ffff00}%d" -1 3@
            if 3@ == 0
            then
                0af8: chat "Был выбран элемент: {ffff00}Первый пункт" -1
            end

            if 3@ == 1
            then
                0af8: chat "Был выбран элемент: {ffff00}Второй пункт" -1
            end

            if 3@ == 2
            then
                0af8: chat "Был выбран элемент: {ffff00}Третий пункт" -1
            end
        else
            0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
        end
    end

    //  DIALOG_STYLE_INPUT & DIALOG_STYLE_PASSWORD
    if 0B3C: samp is_dialog_responded id 46 button 1@ list_item 0 input_text 2@
    then
        if 1@ == 1 // Была нажата первая кнопка
        then
            0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
            0af8: chat "Введеный текст: {ffff00}%s" -1 2@
        else
            0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
        end
    end

    if 0B3C: samp is_dialog_responded id 48 button 1@ list_item 0 input_text 2@
    then
        if 1@ == 1 // Была нажата первая кнопка
        then
            0af8: chat "Была нажата первая кнопка: {ffff00}Уря" -1
            0af8: chat "Введеный текст: {ffff00}%s" -1 2@
        else
            0af8: chat "Была нажата вторая кнопка: {ffff00}Закрыть" -1
        end
    end
end

Создание диалогов:
B + 1(клавиша 1) - открыть диалог типа DIALOG_STYLE_MSGBOX
B + 2(клавиша 2) - открыть диалог типа DIALOG_STYLE_INPUT
B + 3(клавиша 3) - открыть диалог типа DIALOG_STYLE_LIST
B + 4(клавиша 4) - открыть диалог типа DIALOG_STYLE_PASSWORD
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,085
2,114
На метках фигня. Метки лучше использовать для возвращения в предыдущий диалог.
 

Stas07

Известный
Проверенный
266
113
+Ты забыл возвращение после вывода текста в чат.
 
  • Нравится
Реакции: itsLegend

Stas07

Известный
Проверенный
266
113
зачем 0AC9: free_allocated_memory 4@ ты 2 раз не запустиш тогда.
 
  • Нравится
Реакции: itsLegend

Charlatan

Новичок
Друг
290
18
Спасибо за интересный урок. Теперь хоть наиграюсь диалогами
 

Charlatan

Новичок
Друг
290
18
Как ты собираешся наиграться у меня почему-то по его уроку не запускается второй раз.
А делаю почти тоже самое и меня всё норм.
Ну просто с этого урока, я начал учится этим диалогам, в результате мне очень сильно с ними помог Dark_Knight, с его кодом вообще нет проблем,)
 

FunTan

Известный
31
0
Не считывает пункты в листе. Нажимаю на любой пункт, пишет "Закрыто"
 

Ivanek

Новичок
2
0
Помогите вот что получилось
5da191440e88cbf9ce7cd8a6f151cdd9.jpg
 

Ivanek

Новичок
2
0
Вот код: взлом для подьебки друзей :)

Код:
{$CLEO}
 
0000: NOP
 
const
    DIALOG_STYLE_LIST = 2 // Со списком
end
 
// SAMPFUNCS
if 8AF7: get_samp_base_to 33@
then 0A93: end_custom_thread
end
repeat
    wait 400
until 0AFA: is_samp_structures_available
// ---------------------
 
while true
    wait 0 // Чтобы не крашилась игра
    if 0ADC: test_cheat "Vzlom" // Если мы "написали" BH не в чат(ну или нажали эти клавиши, как угодно =)
    then
        0AC8: 4@ = allocate_memory_size 128 // Выделение памяти
        0AD3: string 4@ format "Взлом FTP%cВзлом Rcon%cИзменить Аккаунт%cВзломать Аккаунт%cЗапустить Досс" 10 10 10 10 // %c - идентификатор символа. Если он будет равен 10, это будет означать, что это новая строка.
        0B3B: samp show_dialog id 2 caption "Взлом сервера" text 4@ button_1 "Выбрать" button_2 "Закрыть" style DIALOG_STYLE_LIST // Если всё же мы "написали" BH, то открываем диалог со списком
        0AC9: free_allocated_memory 4@ // Очищаем... т.к. не нужно
 
        repeat
            wait 0
        until 0B3C: samp dialog_respond 0@ button 1@ list_item 2@ input_text 3@v // Получаем возвращаемые параметры диалога(то, что было нажато, введено и т.п.)
 
        // 0@ - ID диалога, 1@ - нажатая кнопка, 2@ - выбранный пункт(только для DIALOG_STYLE_LIST), 3@v - введенный текст(только для DIALOG_STYLE_INPUT и DIALOG_STYLE_PASSWORD)
        if 0@ == 2 // Если наш диалог был закрыт(с ID 2)
        then // то
            if 1@ == 1 // Если была нажата кнопка Выбрал, т.е. 1
            then // то
                if 2@ == 0 // Если был выбран пункт "Тест1"
                then 0AF8: samp add_message_to_chat "Включение базы Hostinger.ru" color 0x00FF00 // пишем в чат "Тест1" зелеными буквами
                end
 
                if 2@ == 1  // Если был выбран пункт "Тест2"
                then 0AF8: samp add_message_to_chat "Открываем Rcon file" color 0x00FF00 // пишем в чат "Тест2" зелеными буквами
                end
 
                if 2@ == 2  // Если был выбран пункт "Тест3"
                then 0AF8: samp add_message_to_chat "Изменение аккаунта в разработкн" color 0x00FF00 // пишем в чат "Тест3" зелеными буквами
                end
 
                if 2@ == 3  // Если был выбран пункт "Тест4"
                then 0AF8: samp add_message_to_chat "Ведите Nick Name (при условие что взломан FTP )" color 0x00FF00 // пишем в чат "Тест4" зелеными буквами
               
                if 2@ == 4  // Если был выбран пункт "Тест4"
                then 0AF8: samp add_message_to_chat "Ведите Nick Name (при условие что взломан FTP )" color 0x00FF00 // пишем в чат "Тест4" зелеными буквами
                end
            else 0AF8: samp add_message_to_chat "Отмена" color 0x00FF00 // если была нажата другая кнопка, выводим в чат "закрыто"
            end
        end
    end
end
 

Mikha Mikhin

Новичок
131
4
Как задать значение строчке больше чем 128 байт, если нужен диалог больше?
 
Статус
В этой теме нельзя размещать новые ответы.