Использование DCMD в моде

Описание: Уроки по скриптингу
Модератор: SJplayer

SJplayer M
Автор темы, Модератор
Модератор
Аватара
SJplayer M
Автор темы, Модератор
Модератор
Сообщения: 196
Зарегистрирован: 25 мая 2013
С нами: 10 лет 10 месяцев

#1 SJplayer » 25 мая 2013, 18:08

Использование DCMD в моде
Автор: Jord

Итак, все мы знает о командах с индексом, или о командах через пробел. Вот пример одной из них:

Код: Выделить всё

if(strcmp(cmd"/givecash"true) == 0) {
        new 
playermoney;
        new 
sendername[MAX_PLAYER_NAME];
        new 
giveplayer[MAX_PLAYER_NAME];
        new 
giveplayeridmoneys;
        
tmp strtok(cmdtextidx);

        if(!
strlen(tmp)) {
            
SendClientMessage(playeridCOLOR_WHITE"USAGE: /givecash [playerid] [amount]");
            return 
1;
        }
        
giveplayerid strval(tmp);

        
tmp strtok(cmdtextidx);
        if(!
strlen(tmp)) {
            
SendClientMessage(playeridCOLOR_WHITE"USAGE: /givecash [playerid] [amount]");
            return 
1;
        }
        
moneys strval(tmp);
        if(
IsPlayerConnected(giveplayerid)) {
            
GetPlayerName(giveplayeridgiveplayersizeof(giveplayer));
            
GetPlayerName(playeridsendernamesizeof(sendername));
            
playermoney GetPlayerMoney(playerid);
            if (
moneys && playermoney >= moneys) {
                
GivePlayerMoney(playerid, (moneys));
                
GivePlayerMoney(giveplayeridmoneys);
                }
            else {
                
SendClientMessage(playeridCOLOR_YELLOW"Неверная сумма");
            }
        }
        else {
                
format(stringsizeof(string), "Игрока %d нет на сервере."giveplayerid);
                
SendClientMessage(playeridCOLOR_YELLOWstring);
            }
        return 
1;
    } 


Но дело даже не в команде, а в её построении. Подробнее о dcmd: DCMD - командный процессор, с помощью которого можно более просто (обходя strtok) создавать команды с параметрами после пробела. Функция создается с помощью константы:

Код: Выделить всё

#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 объявляем новую команду - дать игроку оружие:

Код: Выделить всё

public OnPlayerCommandText(playerid,cmdtext[])
{
dcmd(weapon,6,cmdtext);//Цифра 6 обозначает сколько символов в команде.
return 1;


Этим мы обозначили, что weapon, связан с командой. Теперь создаем новую функцию. В любом месте после OnPlayerCommandText:

Код: Выделить всё

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 больше плюсов чем у стртока. Во первых не надо писать это:

Код: Выделить всё

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;


Во-вторых не нужно никаких:

Код: Выделить всё

if(!strlen(tmp)) и tmp strtok(cmdtextidx); и if(!strval(tmp)) 


Теперь, разберем как делать команды для администратора с тремя переменными. Например /giveweapon id weapon kol-vo
Начинаем так же:

Код: Выделить всё

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 здоровья и брони:

Код: Выделить всё

dcmd_heal(playerid,params[])//Это сама команда
{
#pragma unused params //Это строка говорит о том, что не используется пробел после команды
SetPlayerHealth(playerid,100);
SetPlayerArmor(playerid,100);
return 
1;}
 


Вернуться в «Уроки»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 3 гостя