Здравствуйте, почему в одной команде просто назначен sscanf а в другой
new giveplayerid;
зачем объявлять переменную?
Здравствуйте, почему в одной команде просто назначен sscanf а в другой
new giveplayerid;
зачем объявлять переменную?
В giveplayerid будет храниться id игрока.
u - user, он может быть указан с помощью id(например: 15) или часть ника(например: Nick).
Потому что в первом случае используется параметр params для хранения данных, в котором просто может не оказаться ячеек. Для params выделяется столько ячеек, сколько символов ввёл игрок в качестве параметров. И если, например, написать такую команду:
CMD:test(playerid, params[]) { if(sscanf(params, "I(-1)", params[0]))// Если игрок не ввёл число, то sscanf попытается автоматически подставить "-1" .... return 1; }
То, если ввести "/test", команда не выполнится, так как случится выход за пределы массива, ибо мы никаких параметров не передали с командой => в params не существует нулевой ячейки.
Или если, например, попытаться записать текст из параметра, который находится не напоследнем месте. Например:
CMD:test(playerid, params[]) { .... return 1; }
Если ввести "/test Привет 11 62", то sscanf сначала запишет слово "Привет" в ячейки с нулевой по пятую, а потом перезапишет первую и вторую ячейку указанными числами, портя записанное ранее слово (это довольно распространённая проблема у любителей не объявлять переменные для хранения параметров).
Да и на читаемость это очень сильно влияет, ибо гораздо понятнее смысл передаваемых данных в таком случае:
format(string, sizeof(string), "Игрок %s купил %s за $%d на слот %d", player_name, item_name, item_price, item_slot);
Нежели чем в таком:
format(string, sizeof(string), "Игрок %s купил %s за $%d на слот %d", player_name, params[2], params[0], params[1]);
В первом случае достаточно посмотреть на имя переменной, чтоб понять какие данные там хранятся. Во втором случае нужно смотреть на строку, выискивать среди неё нужный заполнитель и сопоставлять "params[..]" с найденным заполнителем (либо вообще лезть в шапку команды и смотреть структуру sscanf).
Если и использовать params для хранения параметров команды, то только в качестве хранения текста, по типу:
CMD:pm(playerid, params[]) { new giveplayerid; if(giveplayerid == INVALID_PLAYER_ID) return 1; }
В этом случае и вышеперечисленных проблем не будет, и читаемость не сильно упадёт, ибо сразу понятно, что массив params хранит какой-то текст.
Последний раз редактировалось DeimoS; 07.03.2019 в 23:17.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
DmitriyVasilev (08.03.2019)
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
DeimoS (08.03.2019) DmitriyVasilev (08.03.2019)
Да, точно. Забыл про нуль-символ. Ну сути это не меняет и пример тогда будет таким:
CMD:test(playerid, params[]) { if(sscanf(params, "I(-1)I(-1)", params[0], params[1]))// Если игрок не ввёл число, то sscanf попытается автоматически подставить "-1" .... return 1; }
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)