Делаем команду /me

Description: Уроки по скриптингу
Moderator: SJplayer

SJplayer M
Topic author, Модератор
Модератор
Avatar
SJplayer M
Topic author, Модератор
Модератор
Posts: 196
Joined: 25 May 2013
With us: 11 years 4 months

#1by SJplayer » 27 May 2013, 21:17

Делаем команду /me


Если Вы хотите прочитать о делении строки по пробелам с применением strtok, читайте нижний раздел.

Code: Select all

public OnPlayerCommandText(playeridcmdtext[])
{
    if(!
strcmp(cmdtext"/me"true3)) // сравниваем только первые три символа
    
{
        
//Если третий символ (отсчет идет с нуля, НЕ единицы) отсутствует, возврщаем функцию и отправляем игроку сообщение с примером правильного применения:
        
if(!cmdtext[3])return SendClientMessage(playerid0xFF0000FF"USAGE: /me [action]");
 
        new 
str[128];
        
GetPlayerName(playeridstrsizeof(str));
 
        
//Форматируем str: ник игрока и далее введеный текст команды, начиная с четвертого символа (отсчет с 0, напоминаю):
        
format(strsizeof(str), "* %s %s"strcmdtext[4]);
 
        
SendClientMessageToAll(0xFFFF00AAstr);
        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(textsizeof(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(playeridcmdtext[])
{
    new 
cmd[30];    //переменная будет содержать первый параметр (/sayhello)
    
new idx;        //переменная будет хранить, какой по-счету параметр записан
    
cmd strtok(cmdtextidx);        //заполняем строку cmd первым (нулевым, считая по idx = 0) параметром.
 
    
if(strcmp(cmd"/sayhello"true) == 0)        //Если cmd равна '/sayhello':
    
{
        new 
tmp[30];
 
        
// заполняем строку tmp вторым (первым, считая по idx = 1) параметром:
        
tmp strtok(cmdtextidx);
 
        
// конвертируем строку tmp в целое число
        
new otherplayer strval(tmp);
 
        if(
IsPlayerConnected(otherplayer))
        {
            
SendClientMessage(otherplayer0xFFFF00AA"Hi, hello!");
        }
        return 
1;
    }
    return 
0;


Return to “Уроки”

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest