Активный
- Тема Автор
- #1
Команды - основа взаимодействия игроков с сервером. Разберем различные системы команд.
Стандартная система (OnPlayerCommandText)
ZCMD (рекомендуется)
Парсинг параметров с sscanf
Спецификаторы sscanf:
- i - целое число
- d - целое число
- f - число с плавающей точкой
- s - строка
- u - ID игрока (с проверкой подключения)
Проверка прав доступа
Алиасы команд
Команды с подкомандами
Важные моменты:
- Всегда проверяйте параметры команд
- Используйте sscanf для парсинга
- Проверяйте права доступа
- Возвращайте 1 при успехе, 0 при неудаче
- Предоставляйте справку по использованию
Правильная система команд - основа удобного сервера!
Стандартная система (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 при неудаче
- Предоставляйте справку по использованию
Правильная система команд - основа удобного сервера!