PDA

Просмотр полной версии : [Урок] dcmd



Seregamil
09.12.2013, 03:31
Внимание!
Это не пример использования плагина от Daniel_Cortez, это пример использования макроса от DracoBlue

Для использования DCMD достаточно в начало мода добавить данную строку:

#define dcmd(%1,%2,%3) if((strcmp((%3)[1],#%1,true,(%2))==0)&&((((%3)[(%2)+1]==0)&&(dcmd_%1(playerid,"")))||(((%3)[(%2)+1]==32)&&(dcmd_%1(playerid,(%3)[(%2)+2]))))) return 1


Немного информации с википедии:

Использование strtok в OnPlayerCommandText:


public OnPlayerCommandText(playerid, cmdtext[])
{
new index, cmd[20];
cmd = strtok(cmdtext, index);

if (strcmp(cmd, "/heal", true) == 0)
{
new tmp[20];
tmp = strtok(cmdtext, index);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFF0000AA, "Usage : /heal <ID>");
if(!IsPlayerConnected(strval(tmp))) return SendClientMessage(playerid, 0xFF0000AA, "Player not found");
SetPlayerHealth(strval(tmp), 100.0);
SendClientMessage(strval(tmp), 0x00FF00AA, "You have been healed");
SendClientMessage(playerid, 0x00FF00AA, "Player healed");
return 1;
}
return 0;
}

Использование dcmd:


public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(heal, 4, cmdtext);
return 0;
}

dcmd_heal(playerid, params[])
{
if (!strlen(params)) return SendClientMessage(playerid, 0xFF0000AA, "Usage: \"/heal <playerid>\"");
if (!IsPlayerConnected(strval(params)))SendClientMessage(playerid, 0xFF0000AA, "Player not found");
SetPlayerHealth(strval(params), 100.0);
SendClientMessage(strval(params), 0x00FF00AA, "You have been healed");
SendClientMessage(playerid, 0x00FF00AA, "Player healed");
return 1;
}


Команды полностью одинаковые в плане работы, но существует уже меньше кода
Кушает намного мешьше:
1 вариант:

Header size: 280 bytes
Code size: 1756 bytes
Data size: 308 bytes
Stack/heap size: 16384 bytes; estimated max. usage=95 cells (380 bytes)
Total requirements: 18728 bytes
2 вариант


Header size: 280 bytes
Code size: 972 bytes
Data size: 336 bytes
Stack/heap size: 16384 bytes; estimated max. usage=16 cells (64 bytes)
Total requirements: 17972 bytes

Команда находится в отдельной функции, а это значит, что данную команду можно погрузить в тот же текстовый файл и оттуда брать тело.

А теперь небольшой разбор вопросов, которые вечно возникают у новоиспеченных кодеров

- что означает 4 в строке dcmd(heal, 4, cmdtext)
- Ответ: длина команды без параметров.

- когда я не использую params то возникают ошибки, что делать?
- Ответ: в тело команды прописать #pragma unused params

- какое кол-во параметров можно использовать?
- Ответ: пока не надоест, однако с текстовыми параметрами возникают проблемы, если идет сначала текстовый параметр с пробелами, а потом - числовой, то вместо числового выведет следующий текстовый параметр
Если же текстовый параметр - одно слово, а потом - различные числовые параметры - проблем не возникнет.


Ну и как же без практики.

Простая команда /car, использовать которую разрешено только администрации.



public OnPlayerCommandText(playerid, cmdtext[]){
dcmd(car, 3, cmdtext);
return 0;
}

dcmd_car(playerid, params[]){
if(IsPlayerInAnyVehicle(playerid) || !IsPlayerAdmin(playerid)) return false;// если игрок в машине или он не в RCON'е - вернем false
if( (!strlen(params[0])) || (!strlen(params[1])) || (!strlen(params[2])) ) return SendClientMessage(playerid, -1, "/car [modelid] [color1] [color2]");//если мы пропустили какой-то из параметров - сообщим об этом
new Float: _pos[4];
GetPlayerPos(playerid, _pos[0], _pos[1], _pos[2]);//получаем позицию в пространстве
GetPlayerFacingAngle(playerid, _pos[3]);//получаем поворот
return CreateVehicle(strval(params[0]), _pos[0], _pos[1], _pos[2], _pos[3], strval(params[1]), strval(params[2]), 999999);//спавним машину
}

Для кото-то это покажется сложным, но это не сложнее чем те же ZCMD, YCMD etc.
Задавайте вопросы - получите ответы.

Автор - Seregamil

TWIX
09.12.2013, 10:25
Хех Данный автор не ты а самый древний и классный скриптер!

Seregamil
09.12.2013, 11:57
Хех Данный автор не ты а самый древний и классный скриптер!

Автор данной статьи - я, если есть доказательства обратные - в студию.

Salvacore
09.12.2013, 17:20
Молодец.

TWIX
09.12.2013, 20:02
Автор данной статьи - я, если есть доказательства обратные - в студию.

Извени не туда посмотрел Автор действительно ты +сик!