Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя
Показано с 11 по 20 из 24
  1. #11
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Быть может у тебя всё-таки проблемы с клавиатурой, а не с модом? По коду ничего залипать не должно, как и вызываться повторно диалог если зажат пробел, ведь он реагирует только на новое нажатие или отпуск клавиши и никак не проверяет, нажата клавиша или отжата. Если конечно это код из OnPlayerKeyStateChange а не из какого нибудь таймера с отдельными проверками.
    Проблем с клавиатурой нет. Такое было замечено не только у меня. Диалог вызывается из OnPlayerKeyStateChange. Попробуйте сами спровоцировать такую ситуацию

    Логируйте действия
    Подробнее
    ______________________________________________
    Услуги Pawn

  2. #12
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±
    Проверил и вот, что получил:

    Код:
    [09:36:49] 8 - newkeys, 0 - oldkeys
    [09:36:49] 0 - newkeys, 8 - oldkeys
    [09:36:51] 8 - newkeys, 0 - oldkeys
    [09:36:51] 0 - newkeys, 8 - oldkeys
    [09:36:53] 8 - newkeys, 0 - oldkeys
    Вне зависимости от выбора действия. Видимо при использовании диалога самп отправляет данные о отпущенной клавиши, а после заново нажатой. Либо что-то в этом роде. Действительно похоже на баг клиента. Проверил, диалог обнуляется. Причем работает только с диалогом типа DIALOG_STYLE_MSGBOX. Остальные не багаются.
    Последний раз редактировалось Betta; 01.09.2017 в 10:49.

  3. #13
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Vano_Glad Посмотреть сообщение
    Тем не менее клавиша залипает

    PHP код:
    if(newkeys == KEY_SPRINT)
        {
            if(
    select_skin_magazine[playerid] == true)
            {
                if(
    show_dialog[playerid] == false)
                {
                    
    show_dialog[playerid] = true;
                    static const 
    fmt_str[] =
                    
    "\
                        {FFFFFF}Вы уверены что хотите купить эту одежду?\
                        \nЦена: %d\
                    "
    ;
                    new 
    string[sizeof(fmt_str)+5];
                     
    format(stringsizeof(string), fmt_str
                     
    ,
                         
    magazine_money[playerid]
                     );
                     
    SPD(playerid299DSM"Покупка новой одежды"string"Да""Нет");
                }
            }
        } 
    Когда просят показать код реализации, следует показывать весь код, что относится к реализации. В данном случае это и объявление массива show_dialog (обязательно указать где именно он инициализируется), и сброс флажка.

    Вот такой код (тот же самый, что и у тебя, просто обрезано лишнее):
    PHP код:
    new bool:show_dialog[MAX_PLAYERS char];

    public 
    OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        
    printf("\nnewkeys: %d | oldkeys: %d"newkeysoldkeys);
        if(
    newkeys == KEY_SPRINT)
        {
            
    printf("show_dialog: %b"show_dialog[playerid]);
            if(
    show_dialog[playerid] == false)
            {
                
    show_dialog[playerid] = true;
                
    ShowPlayerDialog(playerid299DIALOG_STYLE_MSGBOX"Покупка новой одежды""{FFFFFF}Вы уверены что хотите купить эту одежду?\nЦена: 5000""Да""Нет");
            }
        }
        return 
    1;
    }

    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        if(
    dialogid == 299)
        {
            print(
    "dialogid: 229");
            
    show_dialog[playerid] = false;
        }
        return 
    1;

    Работает на все 100%. Ты можешь сколько угодно держать клавишу во время открытия диалога, но если её отпустить при закрытии этого самого диалога, диалог по новой открыт не будет (соответственно, если продолжать держать - откроется по новой, что логично, ибо пока диалог открыт, игрок не может двигаться, а когда закрывается, игрок начинает двигаться по новой, соответственно, отправляя новую информацию о нажатии клавиш).
    Если ты считаешь "залипанием" именно то, что я описал выше, то тут уже нужно смотреть на конкретную систему, в которой ты хочешь сделать заглушку. Например, если у тебя в системе покупки одежды шифт используется в качестве выбора скина, то достаточно просто обнулять переменную show_dialog именно когда игрок нажал этот шифт и вышел из окна покупки. Если же тебе нужно просто обрабатывать следующее нажатие с задержкой, то можно задействовать таймер. Ну а если нужно не отлавливать кнопку пока игрок её не отожмёт, то тут на помощь придут те самые макросы, один из которых уже кидали выше.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  4. #14
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Когда просят показать код реализации, следует показывать весь код, что относится к реализации. В данном случае это и объявление массива show_dialog (обязательно указать где именно он инициализируется), и сброс флажка.
    Код с нажатием клавиши вы уже видели, сейчас скину остальное. Действительно, проглядел этот момент.

    PHP код:
    case 299:
            {
                if(
    response)
                {
                    
    // Какой-то код...
                
    }
                else 
    SetTimerEx("ShowDialog"1000false"i"playerid);
            }

    fpublic ShowDialog(playerid)
    {
        
    show_dialog[playerid] = false;
        return 
    true;

    Это пожалуй, весь код. Переменная объявлена как
    PHP код:
    new boolshow_dialog[MAX_PLAYERS]; 
    Она обнуляется, то есть равняется значению false при коннекте игрока

    А теперь объясню. Клавишу "пробел" я держу перед открытием диалога. В качестве выбора скина у меня используется "пробел". Я возможно не до конца или неясно выразился, если так, то уточните ещё что от меня требуется. Выше постом человек сам убедился в этом (в том, что такая проблема есть, и она возможно не в моде)
    ______________________________________________
    Услуги Pawn

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Vano_Glad Посмотреть сообщение
    А теперь объясню. Клавишу "пробел" я держу перед открытием диалога. В качестве выбора скина у меня используется "пробел". Я возможно не до конца или неясно выразился, если так, то уточните ещё что от меня требуется. Выше постом человек сам убедился в этом (в том, что такая проблема есть, и она возможно не в моде)
    Ну так если тебе нужно, чтоб диалог не показывался при нажатии на пробел во время выбора скина, обнуляй переменную не сразу в диалоге, а только когда выйдешь из выбора скина (обнулишь select_skin_magazine). Проблема тут не в сампе и не в клавишах, а в твоём алгоритме
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  6. #16
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Ну так если тебе нужно, чтоб диалог не показывался при нажатии на пробел во время выбора скина, обнуляй переменную не сразу в диалоге, а только когда выйдешь из выбора скина (обнулишь select_skin_magazine). Проблема тут не в сампе и не в клавишах, а в твоём алгоритме
    Ну удаляю я эту переменную с обнулениями и прочее, а проблема-то останется и станет только хуже. Я её и создал для того, чтобы диалог не флудил
    ______________________________________________
    Услуги Pawn

  7. #17
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Vano_Glad Посмотреть сообщение
    Ну удаляю я эту переменную с обнулениями и прочее, а проблема-то останется и станет только хуже. Я её и создал для того, чтобы диалог не флудил
    Где я сказал, что её нужно удалять? Ты её слишком рано обнуляешь, из-за чего и происходят проблемы. Обнуляй её в тот момент времени, когда игроку уже не понадобится нажимать на клавишу спринта в твоей системе магазина (то бишь, когда выбран скин).
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. #18
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Где я сказал, что её нужно удалять? Ты её слишком рано обнуляешь, из-за чего и происходят проблемы. Обнуляй её в тот момент времени, когда игроку уже не понадобится нажимать на клавишу спринта в твоей системе магазина (то бишь, когда выбран скин).
    А я и не говорил, что вы сказали её удалить. Я лишь хотел вам сказать о том, что баг не зависит от этого массива. Я могу его убрать, но баг останется. Слишком рано? Я обнуляю её через секунду после закрытия диалога. Проблем не происходит, а наоборот. Часть проблем исчезла, но полностью искоренить этот баг не получилось. Попробуйте спровоцировать эту ситуацию на информационном типе диалога, и думаю поймёте всё сами
    ______________________________________________
    Услуги Pawn

  9. #19
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Vano_Glad Посмотреть сообщение
    А я и не говорил, что вы сказали её удалить. Я лишь хотел вам сказать о том, что баг не зависит от этого массива. Я могу его убрать, но баг останется. Слишком рано? Я обнуляю её через секунду после закрытия диалога. Проблем не происходит, а наоборот. Часть проблем исчезла, но полностью искоренить этот баг не получилось. Попробуйте спровоцировать эту ситуацию на информационном типе диалога, и думаю поймёте всё сами
    Так я кинул код, на котором всё проверял и там видно, что диалог был нужного типа. И, как уже говорил, можно сколько угодно зажимать кнопку, но если её отпустить во время закрытия диалога, он не будет открываться по новой, ибо будет срабатывать проверка. А когда диалог закрывается, переменная обнуляется и, соответственно, проверка уже не будет срабатывать, поэтому естественно диалог откроется по новой. Вы сами прописали определённый алгоритм работы и теперь удивляетесь почему он работает так, а не так, как вам нужно
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. #20
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Так я кинул код, на котором всё проверял и там видно, что диалог был нужного типа. И, как уже говорил, можно сколько угодно зажимать кнопку, но если её отпустить во время закрытия диалога, он не будет открываться по новой, ибо будет срабатывать проверка. А когда диалог закрывается, переменная обнуляется и, соответственно, проверка уже не будет срабатывать, поэтому естественно диалог откроется по новой. Вы сами прописали определённый алгоритм работы и теперь удивляетесь почему он работает так, а не так, как вам нужно
    Я попробовал ваш код - проблема осталась, так что видимо я не сделал ничего не правильного. Вы говорите про мой алгоритм с массивом show_dialog, но если его полностью искоренить, то проблема не исчезнет, а мой алгоритм помог мне избавиться от части проблемы
    ______________________________________________
    Услуги Pawn

 

 
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя

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

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

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

Ваши права

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