Использование strtok RU

From SA-MP Wiki

Jump to: navigation, search

Использование strtok

Урок по использованию strtok

strtok это функция, используемая чтобы определить пробел между командой и параметром. Вам кажется сложным отличать параметры от команды? Этот урок должен вам помочь.

public OnPlayerCommandText(playerid, cmdtext[])
{
    new tmp[255], string[255], cmd[255], idx, giveplayerid, sendername, giveplayer;
    cmd = strtok(cmdtext, idx);
    GetPlayerName(playerid, sendername, sizeof(sendername));
    if(strcmp(cmd, "/akill", true) == 0)
    {
        if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0x919191FF, "Вы должны быть администратором чтобы использовать эту команду.");
        tmp = strtok(cmdtext, idx);
        if(!strlen(tmp)) return SendClientMessage(playerid, 0x919191FF, "Использование: \"/akill [ID]\"");
        giveplayerid = strval(tmp);
        GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
        if(!IsPlayerConnected(giveplayerid))SendClientMessage(playerid, 0x919191FF, "Игрок с данным ID не подключён.");
        SetPlayerHealth(giveplayerid, 0); 
        format(string, sizeof(string), "Админ %s[%i] убил вас!", sendername, playerid);
        SendClientMessage(giveplayerid, 0xE21D2CFF, string);
        format(string, sizeof(string), "Вы убили %s[%i]!", giveplayer, giveplayerid);
        SendClientMessage(playerid, 0xE21D2CFF, string);
        return 1;
   }
}

Объяснение

giveplayerid = strval(tmp);

Присвоение переменной 'giveplayerid', числовое значение 'tmp'.

if(!strlen(tmp)) return SendClientMessage(...);

Если 'giveplayerid' не был указан (То есть было написано /akill вместо /akill ID)

GetPlayerName(playerid, sendername, sizeof(sendername));
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));

Чтобы вывести правильное сообщение (т.е.: "Nickname1(ID:4) убил Nickname2(ID:2)") мы должны извлечь два никнейма в 2 переменные. P.S.: Извлекайте никнейм у 'giveplayerid' ПОСЛЕ того как вы связали его с 'tmp'.

Все равно не очень понятно? Просмотрите это:

if(strcmp(cmd, "/ban", true) == 0)
{
    if(!IsPlayerAdmin(playerid)) 
    return SendClientMessage(playerid, 0x919191FF, "Вы не админ."); // проверка на админку
    tmp = strtok(cmdtext, idx); // Мы объявляем что мы используем strtok для переменной 'tmp'
    if(!strlen(tmp)) return SendClientMessage(playerid, 0x919191FF, "Использование: /ban [id]"); // Если ID не был указан
    giveplayerid = strval(tmp); // Связываем с переменной 'giveplayerid'
    if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid, 0x919191FF, "Игрок с данным ID не подключен."); // если 'giveplayerid' не онлайн
    Ban(giveplayerid);
    return 1;
}

Объяснение

if(!IsPlayerAdmin(playerid))

Если игрок не RCON админ, вывод сообщения, и остановка процесса

tmp = strtok(cmdtext, idx);

Связываем strtok с 'tmp'

if(!strlen(tmp))

Если параметр не был задан, вывод сообщения, и остановка процесса

giveplayerid = strval(tmp);

Связываем 'giveplayerid' с числовым значением tmp

if(!IsPlayerConnected(giveplayerid))

Если 'giveplayerid' не подключён, вывод сообщения, и остановка процесса

Ban(giveplayerid);

Конечный результат команды, каждому понятен.

Переводил на русский язык MazaHACKa

Personal tools
Navigation
Toolbox
In other languages