Итак, сегодня я расскажу вам как пользоватся кастомной функцией strtok, с ее помощью скриптеры делают команды вида /cmd argument1 argument2 , вам наверное всегда хотелось научится делать такие же команды, но нам важно не только сделать такую же, а научится делать.
Итак для начала добавим в мод саму функцию
Code
strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; }
потом добавим в паблик OnPlayerCommandText переменные, нужные для работы нашей функции.
Code
new cmd[128],idx,tmp[128]; cmd = strtok(cmdtext, idx);
где cmd будет - возвращаемое функцией strtok текст введенный в команду(строковый тип), idx - сокращенный вариант написания слова index, будет использоватся в функции, tmp - ее мы будем использовать уже в команде, по аналогии с cmd. И строкой ниже мы в первый раз используем нашу функцию.
Для использования функции команда требует следующего построения:
Code
if(strcmp(cmd, "/mycmd", true) == 0) { }
Итак, теперь разберем на примере как это все будет работать.
мы используем нашу функцию и геттим то, что ввел игрок в поле после команды. Так как strtok возвращает строковый тип далее в функции format мы использовали индикатор %s. Тоесть мы построили команду таким образом, чтобы нам высвечивался введенный нами после команды текст.
функция strlen(переменная) возвращает кол-во символов в переменной с текстом(в данном случае tmp) и если функция ничего не возвращает, то и введенный нами текст - пуст.
Code
new string[64]; format(string,64,"Вы ввели текст: %s",tmp); SendClientMessage(playerid,0xFFFFFFAA,string);
код добавленный мною для того чтобы вы наглядно увидели действие функции.
Итак теперь разберем команды где нам надо ввести числовое значение, например ID игрока.
как вы уже заметили к команде добавилась одна строка:
Code
new numeric = strval(tmp);
разберем ее.
Функция strval(переменная) конвертирует числовое значение из строкового. Тоесть если мы ввели /mycmd 5, то 5 изначально будет строкового типа, а для использования некоторых функций(kick, ban) нам нужно числовое значение, в этих случаях мы используем эту функцию.
if(IsPlayerConnected(target)) { new string[256]; Kick(target); format(string,256,"Кто-то кикнул игрока с ID %d. Причина: %s",target,tmp); SendClientMessageToAll(0xFFFFFFAA,string); } return 1; }
как видите, чтобы сделать многоуровневую команду, надо просто расположить элементы друг за другом и все будет работать. В данной команде я добавил проверку на то подключен ли игрок серверу, так будет получше.
Надеюсь мой урок вам помог.
Внимание, если вам больше нравится zcmd, ненадо писать это в этой теме. Мне тоже она больше нравится. Я писал урок для тех, у кого вероятно есть мод в котором есть данные команды и они непонимают как они устроены. Также неплохо бы это знать для общего развития. Урок написан by REALman
а куда спешить, ведь с strtok команда все равно будет выполнятся секунды, а может и меньше смотря от построения кода, но ведь он будет выполнятся за очень короткое время, за которое даже не надо будет ждать.
Команды, зачастую, являются самой нагружаемой структурой в моде, единожды естественно не даст никаких визуальных результатов, но если относиться ко всему всерьез, то конструкция команды с использованием strcmp и strtok будет неуместным для средних и тяжелых модов, которые имеют перспективу в дальнейшем развитии. По скорости обычная гф-подобная конструкция, я так её называю, медленнее в 3-4 раза, чем конструкция со sscanof'ом и любого другого обработчика команд, например zcmd, от нашего русского программиста. sscanf проходит всего 2 цикла, когда strtok все 6, при двух аргументах, и они имеют достаточно не легкие я бы так сказал проверки. Плюс ко всему этому, в плагине работа идет намного быстрее, само выполнение функций, это тоже приносит свои плюсы, при запуске ваши библиотеки, будь это so или dll интегрируются в главный процесс сервера и работают совместно, поэтому это не приносит абсолютно никакой нагрузки на сервер. При большом количестве онлайн и достаточно сложном моде, в котором итак куча проверок это доп.снижение нагрузки, никак иначе оптимизация будет как раз кстати. Сам я для удобства изменил немного sscanf, были некоторые не удобности в его работе, теперь конфетка, и сокращается время написания всех этих команд в двое. То, что мы видим выше, никак иначе способ, который уже давным давно застарел и ходит по простору всего гф-подобного "чуда". P.S: Секунды хД, если команда выполняется секунды, это уже мега жесть, это говорит о том, что есть огромная задержка, а поскольку павн идет в один поток, то эта задержка скажется на всем моде, это не надо забывать. Но про секунды ты конечно загнул, тут борются за каждую миллисекунду, а ты про секунды)) Однако:
Quote
Внимание, если вам больше нравится zcmd, ненадо писать это в этой теме. Мне тоже она больше нравится. Я писал урок для тех, у кого вероятно есть мод в котором есть данные команды и они непонимают как они устроены. Также неплохо бы это знать для общего развития.
Эту просьбу никто не взял во внимание xD
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Пятница, 29.07.2011, 03:49
Лучше урок по переводу мода с этой доисторической схемы на zcmd или sscanff написали.
More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.