Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок dcmd

Статус
В этой теме нельзя размещать новые ответы.

Seregamil

Мастер
Внимание!
Это не пример использования плагина от 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
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу