Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: sscanf in Diolog case - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
sscanf in Diolog case

#1
Пользователь офлайн   Barsow 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Не проходит проверку, и пишет постоянно "[Ошибка] Введите id игрока и сумму", хоть я ввожу ид и сумму
case 1501:
{
    if(response)
    {
        new string[250];
        new string2[250];
        new params[2];
        cost_acs[playerid] = strval(inputtext); // Цена акса покупающий аксессуар
        new player_bue_acs = GetPVarInt(playerid,"sell_acses"); // Человек покупающий аксессуар
        if(sscanf(params, "ud", player_bue_acs, cost_acs[playerid])) return SendClientMessage(playerid, -1, "[Ошибка] Введите id игрока и сумму");
    }
}


P.S ошибка в названии sscanf in Dialog case

Сообщение отредактировал Barsow: 15 января 2022 - 02:41

0

#2
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
case 1501:
{
    if( !response )
        return true;

    new targetid, price;
    if( sscanf(inputtext, "ud", targetid, price) )
        return SendClientMessage(playerid, -1, "[Ошибка] Введите id игрока и сумму");

    if( targetid == INVALID_PLAYER_ID )
        return SendClientMessage(playerid, -1, "[Ошибка] Игрок не подключен!");

    // .......
}

Вот так примерно должен выглядеть твой участок кода, а не то неподобство, которое ты написал)

Сообщение отредактировал Pa4enka: 15 января 2022 - 02:42

0

#3
Пользователь офлайн   Barsow 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (15 января 2022 - 02:42) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Зачем
    if( !response )
        return true;

если и так когда оно не response, действие не происходит?
Uppdate: А, ты написал примерно, понял

Сообщение отредактировал Barsow: 15 января 2022 - 02:46

0

#4
Пользователь офлайн   Barsow 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (15 января 2022 - 02:42) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Не получилось if( sscanf(inputtext, "ud", targetid, cost_acs[playerid]) ), тут выдает по прежнему "[Ошибка] Введите id игрока и сумму"

Сообщение отредактировал Barsow: 15 января 2022 - 02:52

0

#5
Пользователь офлайн   Sleash 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Как я знаю sscanf смотрит на введённые данные, а точнее есть ли они и какие (мало с ним работал)
И если strval(inputtext) вводится в диалог, то второе данное - ID игрока вводится уже в команде или где-то, где показывается диалог
Собственно решение:
//через sscanf проводи только inputtext:
new cost_acs[MAX_PLAYERS];
if(sscanf(inputtext, "d", cost_acs[playeris])) return SendClientMessage(playerid, - 1, "Введите цену!);

И теперь разберёмся с ID того, кому мы продаём акс:
Лучше всего делать через PVar:
//В код команды или где вызывается диалог
SetPVarInt(playerid, "targetidsellacs", targetid);

И получаем ID уже в самом диалоге:
new targetid = GetPVarInt(playerid, "targetidsellacs");
//тут уже можно делать проверки на подключение второго игрока, на валидность его ID и прочее

Если помог, что наверняка, то не пожалей +сик)
UPD не заметил что ты делал через PVar, зачем тебе проверка на ID в диалоге, если ты должен делать проверку на ID при вводе команды?

Сообщение отредактировал Sleash: 15 января 2022 - 08:58

0

#6
Пользователь офлайн   Sleash 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (15 января 2022 - 02:42) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Не вижу тут смысл, так как ссканф считывает по массивам:
0, 1, 2, 3,...
А в переменных подобных inputtext, 1 массив = 1 символ. Что говорит нам о том, что ваш код считывает просто 2 первых символа того, что игрок ввёл в диалог.
0

#7
Пользователь офлайн   Barsow 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSleash (15 января 2022 - 08:53) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Смотри, человек заходит в меню, нажимает действие, выберает нужный акс и нажимает на него. Появляется в списке 3 действия: надеть, снять и продать. Человек нажимает продать, и должен ввести ид игрока и сумму за которую он хочет продать. По этому я делаю проверку в диалоге
0

#8
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSleash (15 января 2022 - 09:07) писал:

Не вижу тут смысл, так как ссканф считывает по массивам:
0, 1, 2, 3,...
А в переменных подобных inputtext, 1 массив = 1 символ. Что говорит нам о том, что ваш код считывает просто 2 первых символа того, что игрок ввёл в диалог.


Эмм, тебе стоит изучить то, как работает sscanf

Просмотр сообщенияBarsow (15 января 2022 - 02:45) писал:

Зачем
    if( !response )
        return true;

если и так когда оно не response, действие не происходит?
Uppdate: А, ты написал примерно, понял


Затем, что код получается опрятнее, нежели у тебя: сразу видно, что при таком-то условии выполнение кода обрывается.

А касаемо основной проблемы - ты нормально опиши какие переменные и за что у тебя отвечают. И покажи как диалог 1501 выглядит. Ибо пока ты в коде делаешь одно, а в сообщении игроку, при ошибке, сообщаешь совершенно не то, что делаешь.
0

#9
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияBarsow (15 января 2022 - 12:50) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Подобное делается так:
stock ShowSellInventoryItemDialog(playerid)
{
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Продажа", "Введите ID игрока и цену через пробел:\n\nПример: {009900}11 1000", "Далее", "Назад");
}

// Где первый раз нужно показать диалог:
ShowSellInventoryItemDialog(playerid);


//OnDialogResponse
switch(dialogid)
{
    case 1:
    {
        if(!response)
        {
            /*Показываем предыдущий диалог с вариантами действий*/
            return 1;
        }

        new targetid, price;
        if(sscanf(inputtext, "ii", targetid, price))
        {
            SendClientMessage(playerid, -1, "[Ошибка]: Вы не указали ID или цену!");
            ShowSellInventoryItemDialog(playerid);
            return 1;
        }

        if(!IsPlayerConnected(targetid))
        {
            SendClientMessage(playerid, -1, "[Ошибка] Указанный игрок не в сети");
            ShowSellInventoryItemDialog(playerid);
            return 1;
        }

        if(/*Проверка на расстояние*/)
        {
            SendClientMessage(playerid, -1, "[Ошибка] Указанный игрок далеко от Вас");
            ShowSellInventoryItemDialog(playerid);
            return 1;
        }

        if(price < 1)
        {
            SendClientMessage(playerid, -1, "[Ошибка] Цена не может быть меньше 0");
            ShowSellInventoryItemDialog(playerid);
            return 1;
        }

        if(price > 10_000)
        {
            SendClientMessage(playerid, -1, "[Ошибка] Цена не может быть меньше 10000");
            ShowSellInventoryItemDialog(playerid);
            return 1;
        }

        // И тут уже нужные действия с targetid и price
        return 1;
    }
}

0

#10
Пользователь офлайн   Barsow 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (15 января 2022 - 15:16) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


case 1501:
{
    if(response)
    {
        new string[250]; // сообщение для игрока покупающего акс
        new string2[250]; // сообщение для игрока который продает акс
        cost_acs[playerid] = strval(inputtext); // Цена аксессуара которую ввел игрок
        new targetid = GetPVarInt(playerid,"sell_acses"); // Человек покупающий аксессуар
        if(sscanf(inputtext, "dd", targetid, cost_acs[playerid])) return SendClientMessage(playerid, -1, "[Ошибка] Введите id игрока и сумму");
        if(targetid == playerid) // Проверка вводит ли игрок свой ид
        {
            SendClientMessage(playerid, -1, "[Ошибка] Вы не можете продать аксессуар самому себе!");
        }
        if(!IsPlayerConnected(targetid)) // Проверка есть ли игрок на сервере
        {
            SendClientMessage(playerid, COLOR_RED, "Игрок не в сети!");
        }
        if(cost_acs[playerid] > player_info[targetid][MONEY] || cost_acs[playerid] > 10000) return SCM(playerid, COLOR_RED, "У игрока не достаточно денег, либо вы выставили цену меньше 10.000$"); // число которое ввел игрок больше денег, которые есть у покупающего акс игрока, и меньше ли это число 10к
        if(acseccuar_check[0][playerid] == true) // Провека какой именно акс продает человек
        {
            format(string, sizeof(string), "{FFFFFF}Игрок {4682B4}%s {FFFFFF}хочет продать вам аксессуар {CC0000}'Золотая катана' {FFFFFF}за {4682B4}%d$", player_info[targetid][NAME], cost_acs[playerid]); // Сообщение для покупателя
            SPD(targetid,1502,DIALOG_STYLE_MSGBOX,"{4682B4}Продажа аксессуара","{FFFFFF}Вы действительно хотите купить аксессуар {CC0000}'Золотая катана'?","Купить","Отмена"); // диолог который в случае нажатия на "Купить", продает акс,  и сохраняет в бд
            format(string2, sizeof(string2), "{FFFFFF}Вы предложили игроку {4682B4}%s {FFFFFF}купить аксессуар {CC0000}'Золотая катана' {FFFFFF}за {4682B4}%d$", player_info[playerid][NAME], cost_acs[playerid]); // сообщение для продавца
        }
    SCM(targetid, 0x0080FFAA, string);
    SCM(playerid, 0x0080FFAA, string2);
    }
}


0

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика