Использование sscanf в Pawn: парсинг параметров

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

sscanf упрощает парсинг параметров команд. Разберем использование.

Установка
1. Скачайте sscanf2.dll
2. Поместите в папку plugins
3. Добавьте в server.cfg: plugins sscanf2

Подключение
Код:
#include <sscanf2>

Базовое использование
Код:
CMD:give(playerid, params[])
{
    new targetid, amount;
    if(sscanf(params, "ui", targetid, amount))
    {
        SendClientMessage(playerid, -1, "Использование: /give [id] [сумма]");
        return 1;
    }
    
    GivePlayerMoney(targetid, amount);
    return 1;
}

Спецификаторы:
- i - целое число
- d - целое число
- h - шестнадцатеричное число
- o - восьмеричное число
- x - шестнадцатеричное число
- c - символ
- f - число с плавающей точкой
- s - строка
- u - ID игрока (с проверкой)
- q - строка в кавычках
- r - цвет в формате RGB

Примеры использования
Код:
// Парсинг одного параметра
CMD:kick(playerid, params[])
{
    new targetid;
    if(sscanf(params, "u", targetid))
    {
        SendClientMessage(playerid, -1, "Использование: /kick [id]");
        return 1;
    }
    Kick(targetid);
    return 1;
}

// Парсинг нескольких параметров
CMD:teleport(playerid, params[])
{
    new Float:x, Float:y, Float:z;
    if(sscanf(params, "fff", x, y, z))
    {
        SendClientMessage(playerid, -1, "Использование: /teleport [x] [y] [z]");
        return 1;
    }
    SetPlayerPos(playerid, x, y, z);
    return 1;
}

// Парсинг строки
CMD:say(playerid, params[])
{
    new text[128];
    if(sscanf(params, "s[128]", text))
    {
        SendClientMessage(playerid, -1, "Использование: /say [текст]");
        return 1;
    }
    SendClientMessageToAll(-1, text);
    return 1;
}

// Парсинг строки в кавычках
CMD:announce(playerid, params[])
{
    new text[256];
    if(sscanf(params, "q", text))
    {
        SendClientMessage(playerid, -1, "Использование: /announce \"текст\"");
        return 1;
    }
    SendClientMessageToAll(-1, text);
    return 1;
}

// Парсинг цвета
CMD:setcolor(playerid, params[])
{
    new color;
    if(sscanf(params, "r", color))
    {
        SendClientMessage(playerid, -1, "Использование: /setcolor [RGB]");
        return 1;
    }
    // использование цвета
    return 1;
}

Опциональные параметры
Код:
CMD:heal(playerid, params[])
{
    new targetid = playerid, Float:amount = 100.0;
    if(sscanf(params, "uF(-1.0)", targetid, amount))
    {
        SendClientMessage(playerid, -1, "Использование: /heal [id] [количество]");
        return 1;
    }
    
    if(targetid == INVALID_PLAYER_ID)
    {
        targetid = playerid;
    }
    
    SetPlayerHealth(targetid, amount);
    return 1;
}

Массивы параметров
Код:
CMD:giveweapons(playerid, params[])
{
    new targetid, weapons[10], count;
    if(sscanf(params, "ua<i>", targetid, weapons, count))
    {
        SendClientMessage(playerid, -1, "Использование: /giveweapons [id] [оружие1] [оружие2] ...");
        return 1;
    }
    
    for(new i = 0; i < count; i++)
    {
        GivePlayerWeapon(targetid, weapons[i], 500);
    }
    return 1;
}

Проверка параметров
Код:
CMD:setlevel(playerid, params[])
{
    new targetid, level;
    if(sscanf(params, "ui", targetid, level))
    {
        SendClientMessage(playerid, -1, "Использование: /setlevel [id] [уровень]");
        return 1;
    }
    
    if(level < 1 || level > 100)
    {
        SendClientMessage(playerid, -1, "Уровень должен быть от 1 до 100");
        return 1;
    }
    
    PlayerInfo[targetid][pLevel] = level;
    return 1;
}

Комбинирование спецификаторов
Код:
CMD:complex(playerid, params[])
{
    new targetid, Float:x, Float:y, Float:z, text[64];
    if(sscanf(params, "ufffs[64]", targetid, x, y, z, text))
    {
        SendClientMessage(playerid, -1, "Использование: /complex [id] [x] [y] [z] [текст]");
        return 1;
    }
    
    SetPlayerPos(targetid, x, y, z);
    SendClientMessage(targetid, -1, text);
    return 1;
}

Обработка ошибок
Код:
CMD:safe(playerid, params[])
{
    new targetid, amount;
    new result = sscanf(params, "ui", targetid, amount);
    
    if(result)
    {
        switch(result)
        {
            case SSCANF_QUOTE_OPEN:
                SendClientMessage(playerid, -1, "Незакрытая кавычка");
            case SSCANF_NO_MATCH:
                SendClientMessage(playerid, -1, "Неверный формат параметров");
            default:
                SendClientMessage(playerid, -1, "Ошибка парсинга");
        }
        return 1;
    }
    
    // Обработка успешного парсинга
    return 1;
}

Важные моменты:
- Всегда проверяйте результат sscanf
- Используйте правильные спецификаторы
- Указывайте размеры для строковых массивов
- Тестируйте парсинг различных входных данных

sscanf упрощает работу с параметрами команд!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху