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

Тема: u_dialogs.inc

  1. #1
    Аватар для Desulaid
    Младший сержант

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

    u_dialogs.inc

    Описание:
    Библиотека была написана для решения моей проблемы. Она заключалась в том, что мне нужно было разделять мод на модули, во многих из которых велась работа с диалогами, а каждый раз перехватывать OnDialogResponse желания совершенно нет.

    Пример использования:
    PHP код:
    public OnPlayerConnect(playerid)
    {
        
    ShowPlayerDialogEx(playerid#test_dialog, DIALOG_STYLE_INPUT,
            
    "Сказать?",
            
    "Сэр, что вы хотите нам сказать?",
            
    "Сказать""Все равно сказать"
        
    );
        return 
    1;
    }

    DialogResponse:test_dialog(playeridresponselistiteminputtext[])
    {
        return 
    SendClientMessage(playerid, -1inputtext);

    Автор: Антон Стяжкин
    Скачать: загрузить можно перейдя на страницу проекта.

    Копирование данной статьи на других порталах без разрешения автора запрещено!
    Последний раз редактировалось Desulaid; 02.03.2018 в 16:43. Причина: Обновил тему

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    654
    Репутация:
    314 ±
    Можно было узнать адреса функций диалога ещё до момента вызова паблика 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,466
    Репутация:
    265 ±
    Прон, что ли любишь? (Работать с адресами в Pawn )
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

  6. #4
    Аватар для Desulaid
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    660
    Репутация:
    235 ±
    Цитата Сообщение от 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,466
    Репутация:
    265 ±
    шобы ты спросил.
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Для чего после слова "Прон" запятая?

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

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

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

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

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

    Steve Pavlina

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

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

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

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

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

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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