Автор: Jord
Итак, все мы знает о командах с индексом, или о командах через пробел. Вот пример одной из них:
Code: Select all
if(strcmp(cmd, "/givecash", true) == 0) {
new playermoney;
new sendername[MAX_PLAYER_NAME];
new giveplayer[MAX_PLAYER_NAME];
new giveplayerid, moneys;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) {
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /givecash [playerid] [amount]");
return 1;
}
giveplayerid = strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) {
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /givecash [playerid] [amount]");
return 1;
}
moneys = strval(tmp);
if(IsPlayerConnected(giveplayerid)) {
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
GetPlayerName(playerid, sendername, sizeof(sendername));
playermoney = GetPlayerMoney(playerid);
if (moneys > 0 && playermoney >= moneys) {
GivePlayerMoney(playerid, (0 - moneys));
GivePlayerMoney(giveplayerid, moneys);
}
else {
SendClientMessage(playerid, COLOR_YELLOW, "Неверная сумма");
}
}
else {
format(string, sizeof(string), "Игрока %d нет на сервере.", giveplayerid);
SendClientMessage(playerid, COLOR_YELLOW, string);
}
return 1;
}
Но дело даже не в команде, а в её построении. Подробнее о dcmd: DCMD - командный процессор, с помощью которого можно более просто (обходя strtok) создавать команды с параметрами после пробела. Функция создается с помощью константы:
Code: Select all
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') &&
(dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
В начале паблика OnPlayerCommandText объявляем новую команду - дать игроку оружие:
Code: Select all
public OnPlayerCommandText(playerid,cmdtext[])
{
dcmd(weapon,6,cmdtext);//Цифра 6 обозначает сколько символов в команде.
return 1;
}
Этим мы обозначили, что weapon, связан с командой. Теперь создаем новую функцию. В любом месте после OnPlayerCommandText:
Code: Select all
dcmd_weapon(playerid,params[])//Создана команда weapon
{
new weap;//создана переменная
weap = strval(params[0]);//к weap присваивается числовое значение params[0]
if(IsPlayerConnected(playerid))//Проверка, подключён ли игрок к серверу
{
if(IsPlayerAdmin(playerid))//Проверка, является ли игрок, rcon-админом
{
GivePlayerWeapon(playerid,weap,9999999);даем игроку оружие
}
}
return 1;
}
К тому же, у dcmd больше плюсов чем у стртока. Во первых не надо писать это:
Code: Select all
strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}
new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}
Во-вторых не нужно никаких:
Code: Select all
if(!strlen(tmp)) и tmp = strtok(cmdtext, idx); и if(!strval(tmp))
Теперь, разберем как делать команды для администратора с тремя переменными. Например /giveweapon id weapon kol-vo
Начинаем так же:
Code: Select all
dcmd_giveweapon(playerid,params[])//Это сама команда
{
new pleer,weap,kolvo;
pleer = strval(params[0]);//К переменной игрока которому мы даем оружие, мы даем параметр 0
weap = strval(params[1]);//К переменной оружия, мы даем параметр 1
kolvo = strval(params[2]);//К переменной патронов, мы даем параметр 2
if(IsPlayerConnected(pleer))//Проверяем, подключен ли игрок к серверу
{
if(Player[playerid][pAdmin] >= 2)//Проверяем Админку
{
GivePlayerWeapon(pleer,weap,kolvo);//Выполняем действие
}else{
SendClientMessage(playerid,COLOR_RED,"Вы не администратор!");}//Сообщение если игрок не администратор
return 1;
}else{
SendClientMessage(playerid,COLOR_RED,"Игрока нет на сервере");}//Сообщение если игрок не подключен
return 1;
}
И напоследок, как делать команды без параметра. Например, после набора команды, тебе дается 100 здоровья и брони:
Code: Select all
dcmd_heal(playerid,params[])//Это сама команда
{
#pragma unused params //Это строка говорит о том, что не используется пробел после команды
SetPlayerHealth(playerid,100);
SetPlayerArmor(playerid,100);
return 1;}