Делаем команду /me
Если Вы хотите прочитать о делении строки по пробелам с применением strtok, читайте нижний раздел.
Code: Select all
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/me", true, 3)) // сравниваем только первые три символа
{
//Если третий символ (отсчет идет с нуля, НЕ единицы) отсутствует, возврщаем функцию и отправляем игроку сообщение с примером правильного применения:
if(!cmdtext[3])return SendClientMessage(playerid, 0xFF0000FF, "USAGE: /me [action]");
new str[128];
GetPlayerName(playerid, str, sizeof(str));
//Форматируем str: ник игрока и далее введеный текст команды, начиная с четвертого символа (отсчет с 0, напоминаю):
format(str, sizeof(str), "* %s %s", str, cmdtext[4]);
SendClientMessageToAll(0xFFFF00AA, str);
return 1;
}
return 0;
}
Теперь, если мы введем команду '/me blabla' , в чате появится сообщение вида "* Nick blabla". На заметку: в этом коде после '/me' можно не ставить пробел, а написать абсолютно любой символ (здесь происходит проверка только на наличие четвертого символа, о том, чему он равен, ничего не сказано). Т.е. если мы введем команду '/meAHello', в чате появится сообщение вида "* Nick Hello".
Использование strtok()
strtok возвращает строку, которая вышла при "отделении" пробелом в указанной строке. В частых случаях используется для "изъятия" параметров из команды . Например: /freeze PlayerID или /givecash PlayerID Money. В первом примере сделаем команду /sayhello PlayerID, при которой игроку с указанным ID отправляется сообщение "Hi, Hello!".
Но для начала мы возьмем пример попроще, чтобы в полной мере выяснить, как он работает. Будем разбирать на примере строки, содержащей текст, хмм, предположим: "I want to create my gamemod!".
Code: Select all
new text[30]; //наш массив, который будет использоваться в качестве строки
new idx = 0; //Эта переменная нам понадобиться для функции strtok, она будет хранить число, которое будет указывать, какое по счету слово нам нужно "вырезать" из строки
new word[15]; //а этот массив будет использоваться в качестве строки, в которую будут записываться "вырезанные слова" из текста.
//Собственно, заполняем строку нашей фразой
format(text, sizeof(text), "I want to create my gamemod!");
//Предположим, мы хотим вытащить второе слово. Не забывайте, что в программирование отсчет начинается с нуля, поэтому нам нужно указать, что нам нужно "первое", а не нулевое слово:
idx = 1
word = strtok(text,idx);
//Вы можете запросто проверить этот код, не заходя в геймплей игры в консоле, в данный момент строка "word" содержит слово "want".
//Если Вы повторите последнюю строку кода, то строка "word" будет содержать уже следующее слово из фразы, т.к. strtok после использование '''всегда прибавляет единицу ко второму аргументу''', в данном случае к переменной idx.
word = strtok(text,idx);
//Так что, сейчас строка "word" содержит слово "to"
Ну и, естесственно, пример частого использования функции strtok - для изъятия аргументов, указываемых игроками. Здесь мы назовем разделение строки не по словам, а по параметрам, как это принято:
Code: Select all
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[30]; //переменная будет содержать первый параметр (/sayhello)
new idx; //переменная будет хранить, какой по-счету параметр записан
cmd = strtok(cmdtext, idx); //заполняем строку cmd первым (нулевым, считая по idx = 0) параметром.
if(strcmp(cmd, "/sayhello", true) == 0) //Если cmd равна '/sayhello':
{
new tmp[30];
// заполняем строку tmp вторым (первым, считая по idx = 1) параметром:
tmp = strtok(cmdtext, idx);
// конвертируем строку tmp в целое число
new otherplayer = strval(tmp);
if(IsPlayerConnected(otherplayer))
{
SendClientMessage(otherplayer, 0xFFFF00AA, "Hi, hello!");
}
return 1;
}
return 0;
}