Система команд в Pawn: создание и обработка

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

8

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

Команды - основа взаимодействия игроков с сервером. Разберем различные системы команд.

Стандартная система (OnPlayerCommandText)
Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/help", true))
    {
        SendClientMessage(playerid, -1, "Доступные команды: /help, /stats");
        return 1;
    }
    return 0;
}

ZCMD (рекомендуется)
Код:
#include <zcmd>

CMD:help(playerid, params[])
{
    SendClientMessage(playerid, -1, "Доступные команды:");
    SendClientMessage(playerid, -1, "/help - эта справка");
    SendClientMessage(playerid, -1, "/stats - статистика");
    return 1;
}

CMD:stats(playerid, params[])
{
    new string[128];
    format(string, sizeof(string), "Уровень: %d, Деньги: $%d", 
        PlayerInfo[playerid][pLevel], 
        GetPlayerMoney(playerid));
    SendClientMessage(playerid, -1, string);
    return 1;
}

CMD:give(playerid, params[])
{
    new targetid, amount;
    if(sscanf(params, "ui", targetid, amount))
    {
        SendClientMessage(playerid, -1, "Использование: /give [id] [сумма]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid))
    {
        SendClientMessage(playerid, -1, "Игрок не подключен");
        return 1;
    }
    
    GivePlayerMoney(targetid, amount);
    SendClientMessage(playerid, -1, "Деньги выданы");
    return 1;
}

Парсинг параметров с sscanf
Код:
#include <sscanf2>

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:kick(playerid, params[])
{
    if(!IsPlayerAdmin(playerid))
    {
        SendClientMessage(playerid, -1, "У вас нет прав");
        return 1;
    }
    
    new targetid, reason[128];
    if(sscanf(params, "us[128]", targetid, reason))
    {
        SendClientMessage(playerid, -1, "Использование: /kick [id] [причина]");
        return 1;
    }
    
    Kick(targetid);
    return 1;
}

Спецификаторы sscanf:
- i - целое число
- d - целое число
- f - число с плавающей точкой
- s - строка
- u - ID игрока (с проверкой подключения)

Проверка прав доступа
Код:
CMD:admin(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 1)
    {
        SendClientMessage(playerid, -1, "У вас нет прав администратора");
        return 1;
    }
    
    // команда администратора
    return 1;
}

CMD:superadmin(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 3)
    {
        SendClientMessage(playerid, -1, "Требуются права суперадминистратора");
        return 1;
    }
    
    // команда суперадминистратора
    return 1;
}

Алиасы команд
Код:
CMD:help(playerid, params[])
{
    ShowHelp(playerid);
    return 1;
}

CMD:h(playerid, params[])
{
    return cmd_help(playerid, params);
}

CMD:справка(playerid, params[])
{
    return cmd_help(playerid, params);
}

Команды с подкомандами
Код:
CMD:vehicle(playerid, params[])
{
    new subcmd[32], rest[128];
    if(sscanf(params, "s[32]S()[128]", subcmd, rest))
    {
        SendClientMessage(playerid, -1, "Использование: /vehicle [create/delete/list]");
        return 1;
    }
    
    if(!strcmp(subcmd, "create", true))
    {
        // создание транспорта
        new modelid;
        if(sscanf(rest, "i", modelid))
        {
            SendClientMessage(playerid, -1, "Использование: /vehicle create [modelid]");
            return 1;
        }
        CreatePlayerVehicle(playerid, modelid);
    }
    else if(!strcmp(subcmd, "delete", true))
    {
        // удаление транспорта
    }
    else if(!strcmp(subcmd, "list", true))
    {
        // список транспорта
    }
    
    return 1;
}

Важные моменты:
- Всегда проверяйте параметры команд
- Используйте sscanf для парсинга
- Проверяйте права доступа
- Возвращайте 1 при успехе, 0 при неудаче
- Предоставляйте справку по использованию

Правильная система команд - основа удобного сервера!
 

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

Сверху