Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Показано с 1 по 10 из 10

Тема: u_dialogs.inc

  1. #1
    Аватар для Anton Styazhkin
    Модератор

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    661
    Репутация:
    231 ±

    u_dialogs.inc

    Удобная работа с диалогами, путем создания диалоговых функций, размещаемых в любом удобном для вас месте.

    Этот инклуд задумывался как инструмент, с помощью которого можно создавать функции для обработки диалогов в любом удобном для вас месте вашего скрипта. Я не стремлюсь его сделать функциональным инструментом, для этого есть mdialog, я хочу сделать работу в отдельных функция похожей как на OnDialogResponse() для совместимости кода и так же для просто уверенной и привычной работы в этих функциях.

     Нерабочие ссылки от автора
    Скачать последнюю версию.
    Страница проекта на GitHub.

    pastebin.com

    Лог изменений:

    Код:
    1.0
    
    - Создание первой версии.
    1.1
    - Добавление функции IsPlayerUsingDialog(). - Добавление колбэка OnDialogHide().
    1.2
    - Исправление макроса создания функций-обработчиков.
    1.3
    - Удаление функции IsPlayerUsingDialog(). - Удаление колбэка OnDialogHider(). - Некоторая оптимизация памяти.
    1.4
    - Удаление макроса DLG, как и его псевдонимы. - Добавление нового синтаксиса создания диалогов - DialogResponse. - Добавление DialogShowForPlayer (псевдоним ShowPlayerDialogEx()) - Некоторая оптимизация памяти. - Исправление этого бага.
    1.5
    - Добавление макроса IsDialog(). - Обновление синтаксиса создания функций. - Обновил OnDialogReceived() (раньше он вообще был назван не правильно, логическая ошибка). Добавил два аргумента - response и listitem. - Удалил DialogShowForPlayer(). Теперь только ShowPlayerDialogEx(). - Удалил макрос isnull().
    Пример использования:

    PHP код:
    #include <a_samp> 
    #include "u_dialogs" 

    public OnPlayerConnect(playerid

        
    ShowPlayerDialogEx
            
    playerid"test"DIALOG_STYLE_MSGBOX
            
    "Важное уведомление"
            
    "Вы сегодня спали?"
            
    "Да""Нет" 
        
    ); 
        return 
    1


    /* 
      Решил сделать создание функций-обработчиков похожими  
      на создание обычных функций. Ведь, зачастую, нам не нужно  
      использовать все 4 аргумента, а достаточно только два. 
      
      Ненужные аргументы можно скрыть через 
      #pragma unused <arg> 
      
      Функция всегда должна возвращать любое значение. 
    */ 
    DialogResponse:test(playeridresponse, ...) 

        if (!
    response
        { 
            
    SendClientMessage(playerid, -1"Как это вы не спали?!"); 
        } 
        else 
        { 
            
    SendClientMessage(playerid, -1"Хорошо что вы спали. Сегодня много дел!"); 
        } 
        return 
    1


    /* 
      Этот колбэк вызывает перед обработкой диалога и, 
      в случает возвращение нуля, не обрабатывает диалог. 
      При любом другом значении - обрабатывает. 
    */ 
    public OnDialogReceived(playerid, function[], responselistitem

        if (
    IsDialog(function, "test")) 
        { 
            
    SendClientMessage(playerid, -1"Вам запрещено отвечать на этот вопрос!"); 
            return 
    0
        } 
        return 
    1

    Копирование статьи разрешено только с личного разрешения автора.
    Последний раз редактировалось DeimoS; 07.01.2017 в 13:56.
    Дембель первого декабря.

  2. 4 пользователя(ей) сказали cпасибо:
    Batka1337 (20.03.2016)DeimoS (06.05.2016)Geebrox (23.04.2017)Тузик (07.01.2017)
  3. #2
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    589
    Репутация:
    281 ±
    Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

    Вот что-то такое должно было получиться (возможны ошибки):
      Открыть/закрыть
    PHP код:
    static
        
    Dialog_Init()
    {
        new
            
    num_publics,
            
    offs_dat,
            
    offs_pftaddr_charfn_name[32], prefix[4] = {'d','l','g'};
        {
            
    #emit lctrl 1
            #emit neg
            #emit stor.s.pri offs_dat
            #emit add.c 32
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt addr
            #emit add
            #emit const.alt 32
            #emit sub
            #emit stor.s.pri offs_pft
            #emit load.s.pri offs_dat
            #emit add.c 36
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt addr
            #emit add
            #emit const.alt 36
            #emit sub
            #emit load.s.alt offs_pft
            #emit sub
            #emit shr.c.pri 3
            #emit num_publics
        
    }
        new 
    ij;
        do
        {
            
    #emit zero.pri
            #emit stor.s.pri j
            #emit load.s.pri i
            #emit shl.c.pri 3
            #emit load.s.pri offs_pft
            #emit add
            #emit add.c 4
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt offs_dat
            #emit add
            #emit stor.s.pri addr
            
    for (;;)
            {
                
    #emit lref.s.pri addr
                #emit stor.s.pri _char
                #emit load.s.pri addr
                #emit inc.pri
                #emit stor.s.pri addr
                
    if (sizeof prefix j)
                    if ((
    _char 0xFF) != prefix[j++])
                else if ((
    fn_name[j++ - sizeof prefix] = (_char 0xFF)) == '\0')
                {
                    
    #emit lctrl 1
                    #emit neg
                    #emit add.c 32
                    #emit stor.s.pri addr
                    #emit lref.s.alt addr
                    #emit lctrl 1
                    #emit neg
                    #emit add
                    #emit load.s.alt i
                    #emit shl.c.alt 3
                    #emit add
                    #emit stor.s.pri addr
                    #emit lref.s.pri addr
                    #emit const.alt TDW_g_sFunctionAddresses
                    #emit const.pri TDW_g_sDialogCount
                    #emit idxaddr
                    #emit move.alt
                    #emit stor.i
                    #emit push.c MAX_FUNCTION_NAME
                    #emit push.adr fn_name
                    #emit const.alt TDW_g_sDialogNames
                    #emit const.pri TDW_g_sDialogCount
                    #emit idxaddr
                    #emit push.pri
                    #emit push.c 12
                    #emit sysreq.c strpack
                    #emit stack 16
                    
    break;
                }
            }
        } while (++
    != num_publics);

    Последний раз редактировалось VVWVV; 13.03.2016 в 15:06.

  4. Пользователь сказал cпасибо:
    $continue$ (12.03.2016)
  5. #3
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,422
    Репутация:
    261 ±
    Прон, что ли любишь? (Работать с адресами в Pawn )
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  6. #4
    Аватар для Anton Styazhkin
    Модератор

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    661
    Репутация:
    231 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

    Вот что-то такое должно было получится (возможны ошибки):
      Открыть/закрыть
    PHP код:
    static
        
    Dialog_Init()
    {
        new
            
    num_publics,
            
    offs_dat,
            
    offs_pftaddr_charfn_name[32], prefix[4] = {'d','l','g'};
        {
            
    #emit lctrl 1
            #emit neg
            #emit stor.s.pri offs_dat
            #emit add.c 32
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt addr
            #emit add
            #emit const.alt 32
            #emit sub
            #emit stor.s.pri offs_pft
            #emit load.s.pri offs_dat
            #emit add.c 36
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt addr
            #emit add
            #emit const.alt 36
            #emit sub
            #emit load.s.alt offs_pft
            #emit sub
            #emit shr.c.pri 3
            #emit num_publics
        
    }
        new 
    ij;
        do
        {
            
    #emit zero.pri
            #emit stor.s.pri j
            #emit load.s.pri i
            #emit shl.c.pri 3
            #emit load.s.pri offs_pft
            #emit add
            #emit add.c 4
            #emit stor.s.pri addr
            #emit lref.s.pri addr
            #emit load.s.alt offs_dat
            #emit add
            #emit stor.s.pri addr
            
    for (;;)
            {
                
    #emit lref.s.pri addr
                #emit stor.s.pri _char
                #emit load.s.pri addr
                #emit inc.pri
                #emit stor.s.pri addr
                
    if (sizeof prefix j)
                    if ((
    _char 0xFF) != prefix[j++])
                else if ((
    fn_name[j++ - sizeof prefix] = (_char 0xFF)) == '\0')
                {
                    
    #emit lctrl 1
                    #emit neg
                    #emit add.c 32
                    #emit stor.s.pri addr
                    #emit lref.s.alt addr
                    #emit lctrl 1
                    #emit neg
                    #emit add
                    #emit load.s.alt i
                    #emit shl.c.alt 3
                    #emit add
                    #emit stor.s.pri addr
                    #emit lref.s.pri addr
                    #emit const.alt TDW_g_sFunctionAddresses
                    #emit const.pri TDW_g_sDialogCount
                    #emit idxaddr
                    #emit move.alt
                    #emit stor.i
                    #emit push.c MAX_FUNCTION_NAME
                    #emit push.adr fn_name
                    #emit const.alt TDW_g_sDialogNames
                    #emit const.pri TDW_g_sDialogCount
                    #emit idxaddr
                    #emit push.pri
                    #emit push.c 12
                    #emit sysreq.c strpack
                    #emit stack 16
                    
    break;
                }
            }
        } while (++
    != num_publics);

    Если бы я знал работу директивы emit, то может подобное сделал бы. Но я не знаю ее, да и с моим инглишем проблемно читать иноземные письмена.
    Дембель первого декабря.

  7. #5
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    151
    Репутация:
    17 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Прон, что ли любишь? (Работать с адресами в Pawn )
    Для чего после слова "Прон" запятая?
    Мои глаза от твоего кода лезут на гавно-инфо и создают тему о расстановке пикапов.

  8. Пользователь сказал cпасибо:
    Nexius_Tailer (15.03.2016)
  9. #6
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,422
    Репутация:
    261 ±
    шобы ты спросил.
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Для чего после слова "Прон" запятая?
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  10. Пользователь сказал cпасибо:
    Unreal (19.03.2016)
  11. #7
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    151
    Репутация:
    17 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    шобы ты спросил.
    Аргументный аргумент.
    Мои глаза от твоего кода лезут на гавно-инфо и создают тему о расстановке пикапов.

  12. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,758
    Репутация:
    1456 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Аргументный аргумент.
    Ему просто не интересен русский язык. Он программест (ака технарь), а не филолог (ака гуманитарий)
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  13. 4 пользователя(ей) сказали cпасибо:
    Anton Styazhkin (13.03.2016)[ForD] (13.03.2016)Роуди. (14.03.2016)Тузик (07.01.2017)
  14. #9
    Аватар для Тузик
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.06.2016
    Сообщений
    25
    Репутация:
    0 ±
    Ты github удалил? :/
    Телеграфируем в соц.сети "вконтакте" или же мылимся на веревке "VKontakte"?

  15. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,758
    Репутация:
    1456 ±
    Автор немножко солдат теперь, так что вряд ли ответит в ближайшее время :)

    Залил на Pastebin, вроде как, последнюю версию. Добавил в первый пост ссылку.
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •