Внимание!
Это не пример использования плагина от Daniel_Cortez, это пример использования макроса от DracoBlue
Для использования DCMD достаточно в начало мода добавить данную строку:
PHP код:
#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:
PHP код:
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:
PHP код:
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 вариант:
PHP код:
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 вариант
PHP код:
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, использовать которую разрешено только администрации.
PHP код:
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