Здравствуйте, почему в одной команде просто назначен 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 хранит какой-то текст.
Да, точно. Забыл про нуль-символ. Ну сути это не меняет и пример тогда будет таким:
CMD:test(playerid, params[]) { if(sscanf(params, "I(-1)I(-1)", params[0], params[1]))// Если игрок не ввёл число, то sscanf попытается автоматически подставить "-1" .... return 1; }