PDA

Просмотр полной версии : [Вопрос] Помощь с командой



den4is01
11.07.2015, 13:23
Здравствуйте пользователи pro-pawn.ru.Столкнулся с такой проблемой.При вводе /paper ничего не происходит , при вводе /paper write выводит сообщение Введите:{FFFFFF} /paper write [papernr]. Если ввожу номер газеты то всё равно выводит сообщение Введите:{FFFFFF} /paper write [papernr].
http://pastebin.com/rUFrw4Qb

$continue$
11.07.2015, 14:07
Не знаю, скорее всего вот так:


CMD:paper(playerid, params[])
{
if(!IsPlayerConnected(playerid)) return true;
if(PlayerInfo[playerid][pMember] != 9)
return SendClientMessage(playerid, GR, "Вы не Репортер!");
if(!IsPlayerInRangeOfPoint(playerid,3.0,2164.4080,1600.1506,999.9773))
return SendClientMessage(playerid, COLOR_GREY, "Вы не в Здания Редакции Новостей !");
new
type_paper[50],
value_news;
if(sscanf(params, "sd", type_paper, value_news))
return SendClientMessage(playerid, COLOR_GRAYWHITE, "Введите:{FFFFFF} /paper write [papernr] or /paper delete [papernr]");
if(strcmp(type_paper, "write", true) == 0)
{
if(value_news < 1 || value_news > 10)
return SendClientMessage(playerid, COLOR_GREY, "Номер Газеты может быть от 1 до 10 !");
value_news -= 1;
if(PaperInfo[value_news][PaperUsed] == 1)
return SendClientMessage(playerid, COLOR_GREY, "С этим номером есть уже Газета !");
SendClientMessage(playerid, COLOR_LIGHTBLUE, "Вы принялись за создание новой Газеты. Все, что Вы печатаете теперь, будет добавлено в Газету, Вы имеете 11 строк в наличии.");
SendClientMessage(playerid, COLOR_RED, "Длина строки должна не превышать 70 символов, т.е. не больше чем область для ввода строки !");
SendClientMessage(playerid, COLOR_PINK, "Пожалуйста придумайте Название вашей Газеты длиной не более 32 символа !");
WritingPaper[playerid] = 1;//подняли флаг, чтобы писать газету
WritingLine[playerid] = 1;//флаг для название для вашей газеты
WritingPaperNumber[playerid] = value_news;//номер газеты т.е. строка массива куда будем всё писать
}
else if(strcmp(type_paper, "delete", true) == 0)
{
if(PlayerInfo[playerid][pRank] < 8)
return SendClientMessage(playerid, COLOR_GREY, "Вы должны иметь Ранг 8, чтобы Удалять Газеты !");
if(type_paper < 1 || type_paper > 10)
return SendClientMessage(playerid, COLOR_GREY, "Номер Газеты может быть от 1 до 10 !");
type_paper -= 1;
ClearPaper(type_paper);
new
number = type_paper,
string_paper[22];

number += 1;

format(string_paper, sizeof(string_paper), " Bы удалили Газету %d.",number);
SendClientMessage(playerid, COLOR_YELLOW, string_paper);
}
else if(strcmp(type_paper, "write", true) != 0 || strcmp(type_paper, "delete", true) != 0)
return SendClientMessage(playerid, COLOR_GRAYWHITE, "Введите:{FFFFFF} /paper write [papernr] or /paper delete [papernr]");
return true;
}

Daniel_Cortez
11.07.2015, 14:43
Вся проблема в том, что если в sscanf указать спецификатор "s", считана будет вся строка, в т.ч. и содержимое после пробела. На следующий спецификатор ("d") ничего не останется и считывание в любом случае будет неудачным.
Если нужно считать строковое значение до первого пробела, спецификатор "s" следует отделять пробелом от следующего спецификатора (например, "s d").

den4is01
11.07.2015, 16:16
Спасибо большое, помогло!